首页 文章 精选 留言 我的

精选列表

搜索[图形化操作],共10000篇文章
优秀的个人博客,低调大师

阿里云建站新手如何操作 【快速入门】

免费网站怎么建立,免费网站并非免费空间互联网真的有免费建站这等好事? 现在制作一个网站已经越来越容易了,只要知道清晰的流程之后都是可以很快的建好一个企业或者个人网站的 !免费的建站程序很多,下面听哥给你亮出来,建站一般来说分主要有这四步:申请域名、申请虚拟主机、制作网页,网站宣传推广! 教学地址:云上建站快速入门 一域名注册选个好的域名是一个成功网站的开始,尤其是一个好记的有利于客户更好的记住,更有利于做推广。选域名要选容易管理和注册的,cn现在需要营业执照才可以注册,所以建议大家选择com或者net比较多! 二;虚拟主机申请现在主机种类很多商家也是层出百穷。如何选择稳定的和实用的空间是每个消费者心中最满意产品。在选择虚拟主机时候可以给大家几个很好的建议。1:要看其公司是否有资质,一般的都是拥有ICP/ISP双接入资质的比较正规;2:看看机

优秀的个人博客,低调大师

深入解析vue.js数据绑定操作

废话不多说,直接进入正题!!! 数据绑定 响应式的数据绑定系统。建立绑定之后,DOM将和数据保持同步,无须手动维护DOM。使代码能够更加简洁易懂、提升效率。 数据绑定语法 1.文本插值 {{ }}Mustache标签 <span>Hello {{ name }}</span> data:{ name: 'vue' } == > Hello vue 单次插值 首次赋值后再更改vm实例属性值不会引起DOM的变化 <span v-once="name">{{ name }}</span> 2.HTML属性 Mustache标签{{ }} <div v-bind:id="'id-'+id"></div> 简写: <div :id="'id-'+id"></div> 3.绑定表达式 放在Mustache标签内的文本内容。除了直接输出属性值之外,一段绑定表达式可以由一个简单的JavaScript表达式和可选的一个或多个过滤器构成(不支持正则表达式,若需要复杂的转换,则使用过滤器或者计算属性来进行处理)。 {{ index + 1}} {{ index == 0 ? 'a' : 'b' }} {{name.split('').join('|') }} {{ var a = 1 }} //无效 4.过滤器 vue.js允许在表达式后添加可选的过滤器,以管道符"|"指示。 {{ name | uppercase }} // Vue.js将name的值传入给uppercase这个内置的过滤器中(本质是一个函数),返回字符串的大写值。 {{ name | filterA | filterB }} //多个过滤器链式使用 {{ name | filterA arg1 arg2 }} //传入多个参数 filterA将name的值做为第一个参数,arg1,arg2做为第二、第三个参数传入过滤器函数中。 最终函数的返回值即为输出结果。arg1,arg2可以使用表达式,也可以加上单引号,直接传入字符串。 例如: {{ name.split('') | limitBy 3 1 }} // ->u,e 过滤器limitBy可以接受两个参数,第一个参数是设置显示个数,第二个参数为可选,指从开始元素的数组下标。 vue.js内置的10个过滤器(Vue.js2.0中去除) capitalize:字符串首字符转化为大写。 uppercase:字符串转化为大写。 lowercase:字符串转化为小写。 currency:参数为{String}[货币符号],{Number}[小数位],将数字转化成货币符号,并且会自动添加数字分节号。 {{ amount | currency '¥' 2 }} //若amount值为1000,则输出为¥1,000.00 pluralize:参数为{String}single,[double,triple],字符串复数化。 <p v-for="c in count">{{ c | pluralize 'item' }} {{ c | pliralize 'st' 'nd' 'rd' 'th' }} </p> 输出结果: 1item 1st 2items 2nd 3items 3rd 4items 4th json:参数为{Number}[indent]空格缩进数,将json对象数据输出成符合json格式的字符串。 debounce:传入值必须是函数,参数可选,为{Number}[wait],即延时时长。作用是当调用函数n毫秒后,才会执行该动作。 <input v-on:keyup="onKeyup | debounce 500"> //input元素上监听了keyup事件,并且延迟500ms触发 limitBy:传入值必须是数组,参数为{Number}limit,{Number}[offset],limit为显示个数,offset为开始显示数组下标。 <div v-for="item in items | limitBy 10"></div> //items为数组,且只显示数组中的前十个元素 filterBy:传入值必须是数组,参数为{String | Function}targetStringOrFunction,即需要匹配的字符串或函数;"in"可选分隔符。{String}[...searchKeys],为检索的属性区域。 <p v-for="name in names | filterBy '1.0'">{{ name }}</p> //检索names数组中值包含1.0的元素 <p v-for="item in items | filterBy '1.0' in 'name'">{{ item | json }}</p> //检索items中元素属性name值为1.0的元素输出。检索区域也可以为数组,即in [name,version],在多个属性中进行检索。 输出结果 vue1.0 {"name":"vue1.0","version":"1.0"} 使用自定义的过滤函数,函数可以在选项methods中定义 <p v-for="item in items | filterBy customFilter" methods:{ cuestomFilter:function(item){ if(item.name) return true; //检索所有元素中包含name属性的元素 }/欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 } orderBy:传入值必须是数组,参数为{String|Array|Function}sortKeys,即指定排序的策略。 单个键名: <p v-for="item in items | orderBy 'name' -1">{{ item.name}}</p> //items数组中以键名name进行降序排列 多个键名: <p v-for="item in items | orderBy [name,version]">{{item.name}}</p> //使用items里的两个键名进行排序 自定义排序函数: <p v-for="item in items | orderBy customOrder">{{item.name}}</p> methods:{ customOrder: function(a,b){ return parseFloat(a.version) > parseFloat(b.version) //对比item中version的值的大小进行排序 }/欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 } 5.指令 指令的值限定为绑定表达式,即当表达式的值发生改变时,会有些特殊行为作用到绑定的DOM上。 参数:src为参数 <img v-bind:src="avatar" /> <==> <img src="{{avatar}}" /> 修饰符:以半角句号.开始的特殊后缀,用于表示指令应该以特殊方式绑定。 计算属性 避免在模板中加入过重的业务逻辑,保证模版的结构清晰和可维护性。 1.基础例子 var vm = new Vue({ el: '#app', data: { firstName:'Gavin', lastName:'CLY' },/欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 computed: { fullName:function(){ //this指向vm实例 return this.firstName + ' ' + this.lastName; }/欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 } }) <p>{{ firstName }}</p> //Gavin <p>{{ lastName }}</p> //CLY <p>{{ fullName }}</p> //Gavin CLY 注:此时对vm.firstName和vm.lastName进行修改,始终会影响vm.fullName。 2.Setter 更新属性时带来便利 var vm = new Vue({ el:'#el', data:{ cents:100 }, computed:{ price:{ set:function(newValue) { this.cents = newValue * 100; }, get:function(){ return (this.cents / 100).toFixed(2); }/欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 } } }) 表单控件 v-model:对表单元素进行双向数据绑定,在修改表单元素值时,实例vm中对应的属性值也同时更新,反之亦然。 var vm = new Vue({ el:'#app', data: { message: '', gender: '', cheched: '', multiChecked: '', a: 'checked', b: 'checked' }/欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 }) 1. Text 输入框示例,用户输入的内容和vm.message直接绑定: <input type="text" v-model="message" /> <span>Your input is : {{ message }} </span> 2. Radio 单选框示例: <label><input type="radio" value="male" v-model="gender">男</lable> <label><input type="radio" value="famale" v-model="gender">女</lable> <p>{{ gender }}</p> //显示的是value值 3.Checkbox 单个勾选框,v-model即为布尔值,此时Input的value并不影响v-model的值。 <input type="checkbox" v-model="checked" /> <span>checked: {{ checked }} </span> //显示的是true/false 多个勾选框,v-model使用相同的属性名称,且属性为数组。 <label><input type="checkbox" value="1" v-model="multiChecked">1</label> <label><input type="checkbox" value="1" v-model="multiChecked">2</label> <label><input type="checkbox" value="1" v-model="multiChecked">3</label> <p>MultiChecked:{{ multiChecked.join{'|'} }}</p> //multiChecked:1|2 4.Select 单选 <select v-model="selected"> <option selected>A</option> <option>B</option> <option>C</option> </select>/欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 <span>Selected: {{ selected }}</span> 多选 <select v-model="multiSelected" multiple> <option selected>A</option> <option>B</option> <option>C</option> </select>/欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 <span>MultiSelected: {{ multiSelected.join('|') }}</span> 5.绑定value 通过v-bind实现,表单控件的值绑定到Vue市里的动态属性上。 Checkbox <input type="checkbox" v-model="checked" v-bind:true-value="a" v-bind:false-value=" 选中: vm.checked == vm.a //=> true 未选中: vm.checked == vm.b //=>true Radio <input type="radio" v-model="checked" v-bind:value="a" > 选中: vm.checked == vm.a //=> true 3.Select Options <select v-model="selected"> <!-- 对象字面量 --> <option v-bind:value="{ number:123}">123</option> </select>//欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 选中: typeof vm.selected //=> object vm.selected.number //=> 123 6.参数特性 .lazy:默认情况下,v-model在input事件中同步输入框与数据,加lazy属性后会在change事件中同步。 <!-- 在 "change" 而不是 "input" 事件中更新 --> <input v-model.lazy="msg" > .number:自动将用户输入转为Number类型,如果原值转换结果为NaN,则返回原值。 <input v-model.number="age" type="number"> .trim:如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入 <input v-model.trim="msg"> Class与Style绑定 1.Class绑定 对象语法:v-bind:class接受参数是一个对象,而且可以与普通的class属性共存。 <div class="tab" v-bind:class="{'active':active,'unactive':!active}"></div> vm实例中需要包含: data:{ active:true }//欢迎加入全栈开发交流圈一起学习交流:864305860 渲染结果为: <div class="tab active"></div> 数组语法:v-bind:class也接受数组作为参数。 <div v-bind:class="[classA,classB]"></div> vm实例中需要包括: data:{ classA:"class-a", classB:"class-b" }//欢迎加入全栈开发交流圈一起学习交流:864305860 渲染结果为: <div class="class-a class-b"></div> 使用三元表达式切换数组中的class <div v-bind:class="[classA,isB?classB:""]"></div> 若 vm.isB = false 则渲染结果为 <div class="class-a"></div> 2.内联样式绑定(style属性绑定) 对象语法:直接绑定符合样式格式的对象。 <div v-bind:style="alertStyle"></div> vm实例中包含: data:{ alertStyle:{ color: 'red', fontSize: '2px' }//欢迎加入全栈开发交流圈一起学习交流:864305860 } <div v-bind:style="{fontSize:alertStyle.fontSize,color:'red'}"></div> 数组语法:v-bind:style允许将多个样式对象绑定到同一元素上。 <div v-bind:style="[ styleObjectA,styleObjectB]" .></div> 3.自动添加前缀 在使用transform这类属性时,v-bind:style会根据需要自动添加厂商前缀。:style在运行时进行前缀探测,如果浏览器版本本省就不支持不加前缀的css属性,那就不会添加。 结语 感谢您的观看,如有不足之处,欢迎批评指正。

优秀的个人博客,低调大师

Python字符串常用操作方法

去除字符串的两段空白 string.strip() #去除两边 string.rstrip() #去除左边空格 string.lstrip() #去除右边空格 大小写转换 string.upper() #全部大写 string.lower() #全部小写 string.title() #首字母大写,用户规范输出 上面这几个方法都只是暂时改变的展现形式,不该百年原字符串的值,若要改变原字符串的值要重新复制 newstring=string.strip() #实际上这里只是新的变量指向了新的地址,原来的字符串的值还是没有改变,但是我们不适用它了

优秀的个人博客,低调大师

Java各种常用时间操作方法

import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class TimeTest { private int weeks = 0; private int MaxDate;// 一月最大天数 private int MaxYear;// 一年最大天数 public static String getTwoDay(String sj1, String sj2) { SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); long day = 0; try { java.util.Date date = myFormatter.parse(sj1); java.util.Date mydate = myFormatter.parse(sj2); day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); } catch (Exception e) { return ""; } return day + ""; } public static String getWeek(String sdate) { // 再转换为时间 Date date = TimeTest.strToDate(sdate); Calendar c = Calendar.getInstance(); c.setTime(date); // int hour=c.get(Calendar.DAY_OF_WEEK); // hour中存的就是星期几了,其范围 1~7 // 1=星期日 7=星期六,其他类推 return new SimpleDateFormat("EEEE").format(c.getTime()); } public static Date strToDate(String strDate) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); ParsePosition pos = new ParsePosition(0); Date strtodate = formatter.parse(strDate, pos); return strtodate; } public static long getDays(String date1, String date2) { if (date1 == null || date1.equals("")) return 0; if (date2 == null || date2.equals("")) return 0; // 转换为标准时间 SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date date = null; java.util.Date mydate = null; try { date = myFormatter.parse(date1); mydate = myFormatter.parse(date2); } catch (Exception e) { } long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); return day; } // 计算当月最后一天,返回字符串 public String getDefaultDay() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.set(Calendar.DATE, 1);// 设为当前月的1号 lastDate.add(Calendar.MONTH, 1);// 加一个月,变为下月的1号 lastDate.add(Calendar.DATE, -1);// 减去一天,变为当月最后一天 str = sdf.format(lastDate.getTime()); return str; } // 上月第一天 public String getPreviousMonthFirst() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.set(Calendar.DATE, 1);// 设为当前月的1号 lastDate.add(Calendar.MONTH, -1);// 减一个月,变为下月的1号 // lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天 str = sdf.format(lastDate.getTime()); return str; } // 获取当月第一天 public String getFirstDayOfMonth() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.set(Calendar.DATE, 1);// 设为当前月的1号 str = sdf.format(lastDate.getTime()); return str; } // 获得本周星期日的日期 public String getCurrentWeekday() { weeks = 0; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 6); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } // 获取当天时间 public String getNowTime(String dateformat) { Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat(dateformat);// 可以方便地修改日期格式 String hehe = dateFormat.format(now); return hehe; } // 获得当前日期与本周日相差的天数 private int getMondayPlus() { Calendar cd = Calendar.getInstance(); // 获得今天是一周的第几天,星期日是第一天,星期二是第二天...... int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1; // 因为按中国礼拜一作为第一天所以这里减1 if (dayOfWeek == 1) { return 0; } else { return 1 - dayOfWeek; } } // 获得本周一的日期 public String getMondayOFWeek() { weeks = 0; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } // 获得相应周的周六的日期 public String getSaturday() { int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 * weeks + 6); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } // 获得上周星期日的日期 public String getPreviousWeekSunday() { weeks = 0; weeks--; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + weeks); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } // 获得上周星期一的日期 public String getPreviousWeekday() { weeks--; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 * weeks); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } // 获得下周星期一的日期 public String getNextMonday() { weeks++; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } // 获得下周星期日的日期 public String getNextSunday() { int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 + 6); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } private int getMonthPlus() { Calendar cd = Calendar.getInstance(); int monthOfNumber = cd.get(Calendar.DAY_OF_MONTH); cd.set(Calendar.DATE, 1);// 把日期设置为当月第一天 cd.roll(Calendar.DATE, -1);// 日期回滚一天,也就是最后一天 MaxDate = cd.get(Calendar.DATE); if (monthOfNumber == 1) { return -MaxDate; } else { return 1 - monthOfNumber; } } // 获得上月最后一天的日期 public String getPreviousMonthEnd() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.MONTH, -1);// 减一个月 lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天 lastDate.roll(Calendar.DATE, -1);// 日期回滚一天,也就是本月最后一天 str = sdf.format(lastDate.getTime()); return str; } // 获得下个月第一天的日期 public String getNextMonthFirst() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.MONTH, 1);// 减一个月 lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天 str = sdf.format(lastDate.getTime()); return str; } // 获得下个月最后一天的日期 public String getNextMonthEnd() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.MONTH, 1);// 加一个月 lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天 lastDate.roll(Calendar.DATE, -1);// 日期回滚一天,也就是本月最后一天 str = sdf.format(lastDate.getTime()); return str; } // 获得明年最后一天的日期 public String getNextYearEnd() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.YEAR, 1);// 加一个年 lastDate.set(Calendar.DAY_OF_YEAR, 1); lastDate.roll(Calendar.DAY_OF_YEAR, -1); str = sdf.format(lastDate.getTime()); return str; } // 获得明年第一天的日期 public String getNextYearFirst() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.YEAR, 1);// 加一个年 lastDate.set(Calendar.DAY_OF_YEAR, 1); str = sdf.format(lastDate.getTime()); return str; } // 获得本年有多少天 private int getMaxYear() { Calendar cd = Calendar.getInstance(); cd.set(Calendar.DAY_OF_YEAR, 1);// 把日期设为当年第一天 cd.roll(Calendar.DAY_OF_YEAR, -1);// 把日期回滚一天。 int MaxYear = cd.get(Calendar.DAY_OF_YEAR); return MaxYear; } private int getYearPlus() { Calendar cd = Calendar.getInstance(); int yearOfNumber = cd.get(Calendar.DAY_OF_YEAR);// 获得当天是一年中的第几天 cd.set(Calendar.DAY_OF_YEAR, 1);// 把日期设为当年第一天 cd.roll(Calendar.DAY_OF_YEAR, -1);// 把日期回滚一天。 int MaxYear = cd.get(Calendar.DAY_OF_YEAR); if (yearOfNumber == 1) { return -MaxYear; } else { return 1 - yearOfNumber; } } // 获得本年第一天的日期 public String getCurrentYearFirst() { int yearPlus = this.getYearPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, yearPlus); Date yearDay = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preYearDay = df.format(yearDay); return preYearDay; } // 获得本年最后一天的日期 * public String getCurrentYearEnd() { Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");// 可以方便地修改日期格式 String years = dateFormat.format(date); return years + "-12-31"; } // 获得上年第一天的日期 * public String getPreviousYearFirst() { Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");// 可以方便地修改日期格式 String years = dateFormat.format(date); int years_value = Integer.parseInt(years); years_value--; return years_value + "-1-1"; } // 获得上年最后一天的日期 public String getPreviousYearEnd() { weeks--; int yearPlus = this.getYearPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, yearPlus + MaxYear * weeks + (MaxYear - 1)); Date yearDay = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preYearDay = df.format(yearDay); getThisSeasonTime(11); return preYearDay; } // 获得本季度 public String getThisSeasonTime(int month) { int array[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }; int season = 1; if (month >= 1 && month <= 3) { season = 1; } if (month >= 4 && month <= 6) { season = 2; } if (month >= 7 && month <= 9) { season = 3; } if (month >= 10 && month <= 12) { season = 4; } int start_month = array[season - 1][0]; int end_month = array[season - 1][2]; Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");// 可以方便地修改日期格式 String years = dateFormat.format(date); int years_value = Integer.parseInt(years); int start_days = 1;// years+"-"+String.valueOf(start_month)+"-1";//getLastDayOfMonth(years_value,start_month); int end_days = getLastDayOfMonth(years_value, end_month); String seasonDate = years_value + "-" + start_month + "-" + start_days + ";" + years_value + "-" + end_month + "-" + end_days; return seasonDate; } private int getLastDayOfMonth(int year, int month) { if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { return 31; } if (month == 4 || month == 6 || month == 9 || month == 11) { return 30; } if (month == 2) { if (isLeapYear(year)) { return 29; } else { return 28; } } return 0; } public boolean isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } //上个月的今天 public static String getNowOfLastMonth() { SimpleDateFormat aSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); GregorianCalendar aGregorianCalendar = new GregorianCalendar(); aGregorianCalendar.set(Calendar.MONTH, aGregorianCalendar .get(Calendar.MONTH) - 1); String nowOfLastMonth = aSimpleDateFormat .format(aGregorianCalendar.getTime()); return nowOfLastMonth; } //去年的今天 public static String getNowOfLastYear() { SimpleDateFormat aSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); GregorianCalendar aGregorianCalendar = new GregorianCalendar(); aGregorianCalendar.set(Calendar.YEAR, aGregorianCalendar .get(Calendar.YEAR) - 1); String currentYearAndMonth = aSimpleDateFormat .format(aGregorianCalendar.getTime()); return currentYearAndMonth; } public static void main(String[] args) { TimeTest tt = new TimeTest(); System.out.println("获取当天日期:" + tt.getNowTime("yyyy-MM-dd")); System.out.println("获取本周一日期:" + tt.getMondayOFWeek()); System.out.println("获取本周日的日期~:" + tt.getCurrentWeekday()); System.out.println("获取上周一日期:" + tt.getPreviousWeekday()); System.out.println("获取上周日日期:" + tt.getPreviousWeekSunday()); System.out.println("获取下周一日期:" + tt.getNextMonday()); System.out.println("获取下周日日期:" + tt.getNextSunday()); System.out.println("获得相应周的周六的日期:" + tt.getNowTime("yyyy-MM-dd")); System.out.println("获取本月第一天日期:" + tt.getFirstDayOfMonth()); System.out.println("获取本月最后一天日期:" + tt.getDefaultDay()); System.out.println("获取上月第一天日期:" + tt.getPreviousMonthFirst()); System.out.println("获取上月最后一天的日期:" + tt.getPreviousMonthEnd()); System.out.println("获取下月第一天日期:" + tt.getNextMonthFirst()); System.out.println("获取下月最后一天日期:" + tt.getNextMonthEnd()); System.out.println("获取本年的第一天日期:" + tt.getCurrentYearFirst()); System.out.println("获取本年最后一天日期:" + tt.getCurrentYearEnd()); System.out.println("获取去年的第一天日期:" + tt.getPreviousYearFirst()); System.out.println("获取去年的最后一天日期:" + tt.getPreviousYearEnd()); System.out.println("获取明年第一天日期:" + tt.getNextYearFirst()); System.out.println("获取明年最后一天日期:" + tt.getNextYearEnd()); System.out.println("获取本季度第一天到最后一天:" + tt.getThisSeasonTime(11)); System.out.println("获取两个日期之间间隔天数2012-04-26~2012 -04-30:" + TimeTest.getTwoDay("2012-04-26 ", "2012 -04-30 ")); } }

优秀的个人博客,低调大师

LinkedBlockingQueue阻塞队列offer()操作抛出中断异常

说明 在使用LinkedBlockingQueue的offer方法时,出现了中断异常,现分析一下出现这个中断异常的原因。 会产生中断异常的Demo import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; public class TestLinkedBlockingQueue { public static void main(String[] args) { LinkedBlockingQueue lbq = new LinkedBlockingQueue(3); for(int i = 0; i < 10; i++){ try { System.out.println(lbq); //这里用offer方法往阻塞队列里面添加对象,此方法表示若队列满了,则等待1秒,1秒后若队列还是满的,则丢弃数据。 lbq.offer(i, 1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Thread.currentThread().interrupt();//如果注释掉这行代码,则此程序不会抛出异常 } } } LinkedBlockingQueue的offer源码方法 public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException { if (e == null) throw new NullPointerException(); long nanos = unit.toNanos(timeout); int c = -1; final ReentrantLock putLock = this.putLock; final AtomicInteger count = this.count; putLock.lockInterruptibly(); try { while (count.get() == capacity) { if (nanos <= 0) return false; nanos = notFull.awaitNanos(nanos); } enqueue(new Node<E>(e)); c = count.getAndIncrement(); if (c + 1 < capacity) notFull.signal(); } finally { putLock.unlock(); } if (c == 0) signalNotEmpty(); return true; } //lockInterruptibly方法 public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(1); } //acquireInterruptibly方法 public final void acquireInterruptibly(int arg) throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); if (!tryAcquire(arg)) doAcquireInterruptibly(arg); } 所以,当线程被标记有中断标志时,offer添加时将获取不到锁,直接抛出中断异常。

优秀的个人博客,低调大师

使用JPA + Eclipselink操作PostgreSQL数据库

首先确保您已经安装了PostgreSQL。您可以参考我这篇文章PostgreSQL扫盲教程。 使用Eclipse创建一个新的JPA project: Platform选择EclipseLink,作为JPA的provider之一。 在Eclipse里自动生成的project如下图所示: 用下列xml的内容覆盖自动生成的xml: <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="jerryjpa" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>jpatest.Person</class> <properties> <property name="eclipselink.ddl-generation" value="create-tables" /> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/postgres"/> <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/> <property name="javax.persistence.jdbc.user" value="postgres"/> <property name="javax.persistence.jdbc.password" value="test_password"/> </properties> </persistence-unit> </persistence> 新建一个Java class: package jpatest; import javax.persistence.Basic; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.NamedQuery; import javax.persistence.Table; @Entity @Table(name = "T_PERSON") @NamedQuery(name = "AllPersons", query = "select p from Person p") public class Person { @Id @GeneratedValue private long id; @Basic private String firstName; @Basic private String lastName; public long getId() { return id; } public void setId(long newId) { this.id = newId; } public String getFirstName() { return this.firstName; } public void setFirstName(String newFirstName) { this.firstName = newFirstName; } public String getLastName() { return this.lastName; } public void setLastName(String newLastName) { this.lastName = newLastName; } } 现在可以写测试程序了: package jpatest; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class Test { public static void main(String[] args) { String persistenceUnitName = "jerryjpa"; EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName); EntityManager entityManager = factory.createEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); Person user = new Person(); user.setFirstName("Jerry_SAP"); user.setLastName("Wang"); entityManager.persist(user); transaction.commit(); entityManager.close(); factory.close(); System.out.println("done"); } } 成功执行后,在PostgreSQL的Admin UI上能看到测试Java程序里用JPA插入数据库的记录: 本文完整的源代码和所需的库文件可以在我的github上找到。 eclipselink-2.5.1.jar javax.persistence-2.1.0.jar postgresql-42.1.1.jar 要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册