很久以前java8中就推出了新的Time API,旨在解决旧版Date和Calendar的缺陷。讲道理真的挺好用的,不过由其他工具对新版time的兼容并不够完善,导致现在使用还不够普及。大家都还在用老的Date类,苦?的封装时间工具函数,感?真的没意思。
(一)旧版Time/Date类的缺陷
(1)线程不安全:
首先旧版本的时间类是线程不安全的,在多线程操作同一个时间类实例时,会抛出异常。而新版本的时间工具全部都是线程安全的。
(2)设计混乱、可读性不好:
旧版本的java.util.Date,虽然名字叫Date,?是其实既包含日期也包含时间。同时在mysql中也有个java.sql.Date,这两个Date名字一摸一样,但是mysql的Date是不包含时间的。另外对日期格式化的工具却在java.text包中。包比较混乱,对我们程序盐多有不便。
(3)没有良好的时区方法支持:
新版本的时间类提供了非常良好的时区API,旧版本需要使用java.util.Calendar
and java.util.TimeZone
等类。
(二)新版日期时间API的使用
1.LocalDate的使用:
(1)轻松的实现日期和周间的转换
// 获取2016年6月12号是周几
LocalDate.parse("2016-06-12").getDayOfWeek();
(2)轻松的判断是不是闰年
boolean leapYear = LocalDate.now().isLeapYear();
(3)轻松的获取每天的起始时间和结束时间
LocalDateTime beginningOfDay = LocalDate.parse("2016-06-12").atStartOfDay();
2.LocalTime的使用:
(1)轻松的获取时间最大值
// 23:59:59.99
LocalTime maxTime = LocalTime.MAX
(2)轻松的进行时间增减
(1)轻松的获取巴黎的时区
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
3.LocalDateTime的使用:
LocalDateTime包含日期和时间,是之前两者的合集,这里就不详细介绍了。
(三)新版时区API的使用
(1)轻松的获取巴黎的时区
ZoneId zoneId = ZoneId.of("Europe/Paris");
(2)将本地时区时间转为其他时区时间:
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
(四)获取日期时间间隔
// 日期间隔天数
int five = Period.between(finalDate, initialDate).getDays();
// 时间间隔秒数
int thirty = Duration.between(finalTime, initialTime).getSeconds();