制作个人业务网站,天津网站建设教程,wordpress响应式模板,个人做搜索引擎网站违法吗Calendar类要点、易错点
简介#xff1a;
用于日期的计算。
是一个抽象类#xff0c;得用它的静态方法getInstance()获取#xff08;它的子类#xff09;实例。#xff08;会根据地区的不同创建当地使用的日历#xff09;
将年月日等都存在了它的一个private数组里
用于日期的计算。
是一个抽象类得用它的静态方法getInstance()获取它的子类实例。会根据地区的不同创建当地使用的日历
将年月日等都存在了它的一个private数组里fields[]。
年在该数组的下标存在了public static字段YEAR里以此类推。
具体
// set 设定某字段的值
// get 获取某字段的值
// add 增加某字段的值
// getTime 获取日历时间 表示的 Date对象
// getTimeInMillis 获取用毫秒数表示的日历时间
// setTime(date); 用Date对象给日历时间赋值
// getActualMaximum 获取某字段的最大值
Calendar cl Calendar.getInstance(); //创建时间为当前时间的日历System.out.println(cl.get(Calendar.YEAR));
System.out.println(cl.get(Calendar.MONTH));cl.set(Calendar.MONTH, 1);
cl.add(Calendar.MONTH, -4);
Date d cl.getTime();System.out.println(cl.get(Calendar.YEAR));
System.out.println(cl.get(Calendar.MONTH));
int m cl.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(m);运行结果
2022
7
2021
9
31一些意料之外的细节
格列高利月历的Month是0 到 11中国默认格列高利月历即公历其他字段从1开始不含0Calendar.HOUR默认是按12小时制处理Calendar.HOUR_OF_DAY才是24小时。DAY_OF_WEEK星期日对应的是1星期六才是7。
易错点
Calendar calendar1 Calendar.getInstance();
Calendar calendar2 Calendar.getInstance(); //比calendar1晚了几毫秒
calendar2.set(Calendar.DAY_OF_MONTH, 2);
calendar2.set(Calendar.DAY_OF_MONTH, 1); //设置calendar2比calendar1早了一天
//计算calendar1\calendar2差了几天
long deltaDays (calendar1.getTimeInMillis()-calendar2.getTimeInMillis())/1000/60/60/24;
int days (int) deltaDays;
System.out.println(days);实际输出
18错误原因分析
这是由于calendar2初始化晚于calendar1造成的。
从ms精度上来讲calendar1-calendar2一天-几毫秒1天整除1000x60x60x24后 等于 0.
如果倒过来calendar1的日期比calendar2早就不影响calendar1-calendar2的结果了只会影响calendar2-calendar1的结果
修改方法
long deltaDays (calendar1.getTimeInMillis()-calendar2.getTimeInMillis())/1000/60/60/24;
int days (int) deltaDays;
if (calendar1.after(calendar2)){days;
}ps如果这里days的计算方式如下也会造成错误
int days (int)(calendar1.getTimeInMillis()-calendar2.getTimeInMillis())/1000/60/60/24;错误原因
强制类型转换优先级比除法高会先将getTimeInMillis()方法返回的long类型数字截断成为int此处造成高置位不为0数字丧失。
解决方法
在整个计算式外面加一个()改变计算优先级。由于整除后得到的数字不大于2 16 2^{16}216故强制类型转换不会造成数值变化。
Calendar中的DATE 和 DAY_OF_MONTH 和 DAY_OF_YEAR
cal1.add(Calendar.DAY_OF_MONTH,1);
cal1.add(Calendar.DAY_OF_YEAR,1);
cal1.add(Calendar.DATE,1); 就单纯的add操作结果都一样因为都是将日期1 就没有区别说是在月的日期中加1还是年的日期中加1
但是Calendar设置DAY_OF_MONTH和DAY_OF_YEAR的目的不是用来1 将日期加1这通过cal1.add(Calendar.DATE,1)就可以实现
DAY_OF_MONTH的主要作用是cal.get(DAY_OF_MONTH)用来获得这一天在是这个月的第多少天 Calendar.DAY_OF_YEAR的主要作用是cal.get(DAY_OF_YEAR)用来获得这一天在是这个年的第多少天。 同样还有DAY_OF_WEEK用来获得当前日期是一周的第几天