欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Calendar类要点、易错点

程序员文章站 2022-03-13 21:24:43
简介:用于日期的计算。是一个抽象类,得用它的静态方法getInstance()获取(它的子类)实例。(会根据地区的不同创建当地使用的日历)将年月日等都存在了它的一个private数组里:fields[]。年在该数组的下标存在了public static字段YEAR里,以此类推。具体:// set 设定某字段的值// get 获取某字段的值// add 增加某字段的值// getTime 获取日历时间 表示的 Date对象// getTimeInMillis 获取用毫秒数表示的日历时间/...

简介:

用于日期的计算。

是一个抽象类,得用它的静态方法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);

运行结果:

2020
11
2019
9
31

一些意料之外的细节:

  1. 格列高利月历的Month是0 到 11!(中国默认格列高利月历,即公历)(其他字段从1开始,不含0)
  2. Calendar.HOUR默认是按12小时制处理,Calendar.HOUR_OF_DAY才是24小时。
  3. 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);

实际输出:

0

错误原因分析:

这是由于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,故强制类型转换不会造成数值变化。

本文地址:https://blog.csdn.net/eggzxy/article/details/111994216