Calendar类要点、易错点&Calendar中的DATE 和 DAY_OF_MONTH 和 DAY_OF_YEAR
Calendar类要点、易错点
简介:
用于日期的计算。
是一个抽象类,得用它的静态方法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开始,不含0)
- Calendar.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,用来获得当前日期是一周的第几天
相关文章
- 路由策略和策略路由 & route-map
- Centos7.2下安装redis&通用键值命令
- [UI] Elastic Stack & scrollReveal.js
- 《云原生架构容器&微服务优秀案例集》惊喜来袭
- Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os error was
- [Angular 2] Value Providers & @Inject
- [Big Data] pageRank and link analysis && MapReduce
- 错误1Files 的值“<<<<<<< .mine”无效。路径中具有非法字符。
- Interop type 'Microsoft.Office.Interop.Word.ApplicationClass' cannot be embedded. Use the applicable
- php安装&配置
- High&NewTech:2019.08.08华为发布—面向2025十大趋势
- 相关性分析热力图(Python&Matlab代码实现)
- C++QT开发——TCP&UDP网络编程
- Java 两个日期之间相差的天数计算 & Calendar的DAY_OF_MONTH, DAY_OF_YEAR, DATE的区别
- ORA-06553:PLS-306:wrong number or types of arguments in call to ''
- 【大数据&AI人工智能】OLAP 关键技术演进思考
- openwrt上opkg更新报错"opkg_download: Failed to download ............."
- 一文读懂14种 UML 图业务建模&系统分析的设计方式(上)
- Intel TDT检测 & PMU数据采集分析——todo,待使用实际恶意样本跑数据分析效果
- MariaDB 插入&更新&删除数据