使用Java日期时间类,每一个人都很熟悉每一个项目中必不可少的工具类就是dateutil,包含各类日期计算,格式化等处理,并且经常会遇到找不到可用的处理方法,须要本身新增方法,处理过程很复杂。html
Date中的方法通常都过期了,不建议使用,有一些歧义。好比:java
(1)new Date(2019,01,01)
实际是3919年2月。由于Date的构造函数 的年份表示的始于1900年的差值。sql
(2)month是从0开始的。函数
(3)Date若是不格式化,打印出的日期可读性差。工具
Fri Dec 13 23:08:12 CST 2019
(4)Date和java.sql.Date命名彻底同样,不易区分。spa
Calendar虽然可以处理大部分的Date计算,但设计不是很成功,一些简单操做都要屡次调用。对一些复杂的计算好比两个日期之间有多少个月,生日计算年龄等都不支持。好比:设计
(1)DAY_OF_WEEK 的取值,是从周日(1)开始的。code
Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
(2)MONTH 的取值,是从0开始的。htm
Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); System.out.println(calendar.get(Calendar.MONTH));
(3)set()方法延迟修改blog
经过set()方法设置某一个字段的值得时候,该字段的值不会立马修改,直到下次调用get()、getTime()等时才会从新计算日历的时间。延迟修改的优点是屡次调用set()方法不会触发屡次没必要要的计算。下面程序演示了set()方法延迟修改的效果:
Calendar cal = Calendar.getInstance(); cal.set(2003,7,31);//2003-8-31 //将月份设为9,但9月31不存在 //若是当即修改,系统会把cal自动调整到10月1日 cal.set(Calendar.MONTH,8); //下面代码输出了10月1日 System.out.println(cal.getTime());//(1) //设置DATE字段为5 cal.set(Calendar.DATE, 5);//(2) System.out.println(cal.getTime());//(3)
打印结果为:
Wed Oct 01 22:25:41 CST 2003
Sun Oct 05 22:25:41 CST 2003
若是将(1)处的代码注释掉,打印结果为:
Fri Sep 05 22:28:06 CST 2003
你看明白了吗?若是将(1)处的代码注释掉,由于set()方法具备延迟性,它内部只是先记录下MONTH字段的值为8,接着程序将DATE字段设置为5,程序内部再次记录DATE字段的值为5——就是9月5日。
参考:https://www.jianshu.com/p/1478af429a1e
https://www.cnblogs.com/bingyimeiling/p/10420752.html