简介:
用于日期的计算。
是一个抽象类,得用它的静态方法getInstance()获取(它的子类)实例。(会根据地区的不同创建当地使用的日历)
将年月日等都存在了它的一个private数组里:fields[]。
年在该数组的下标存在了public static字段YEAR里,以此类推。
具体:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21// 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);
运行结果:
1
2
3
4
5
62020 11 2019 9 31
一些意料之外的细节:
- 格列高利月历的Month是0 到 11!(中国默认格列高利月历,即公历)(其他字段从1开始,不含0)
- Calendar.HOUR默认是按12小时制处理,Calendar.HOUR_OF_DAY才是24小时。
- DAY_OF_WEEK,星期日对应的是1,星期六才是7。
易错点:
1
2
3
4
5
6
7
8
9Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); //比calendar1晚了几毫秒 calendar2.set(Calendar.DAY_OF_MONTH, 2); calendar2.set(Calendar.DAY_OF_MONTH, 1); //设置calendar2比calendar1早了一天 //计算calendar1calendar2差了几天 long deltaDays = (calendar1.getTimeInMillis()-calendar2.getTimeInMillis())/1000/60/60/24; int days = (int) deltaDays; System.out.println(days);
实际输出:
1
20
错误原因分析:
这是由于calendar2初始化晚于calendar1造成的。
从ms精度上来讲,calendar1-calendar2=一天-几毫秒<1天,整除1000x60x60x24后 等于 0.
(如果倒过来calendar1的日期比calendar2早,就不影响calendar1-calendar2的结果了,只会影响calendar2-calendar1的结果)
修改方法:
1
2
3
4
5
6long deltaDays = (calendar1.getTimeInMillis()-calendar2.getTimeInMillis())/1000/60/60/24; int days = (int) deltaDays; if (calendar1.after(calendar2)){ days++; }
ps:如果这里days的计算方式如下,也会造成错误
1
2int days = (int)(calendar1.getTimeInMillis()-calendar2.getTimeInMillis())/1000/60/60/24;
错误原因:
强制类型转换优先级比除法高,会先将getTimeInMillis()方法返回的long类型数字截断成为int,此处造成高置位不为0数字丧失。
解决方法:
在整个计算式外面加一个"()",改变计算优先级。由于整除后得到的数字不大于 2 16 2^{16} 216,故强制类型转换不会造成数值变化。
最后
以上就是伶俐唇彩最近收集整理的关于Calendar类要点、易错点的全部内容,更多相关Calendar类要点、易错点内容请搜索靠谱客的其他文章。
发表评论 取消回复