当你开始使用Java操作日期和时间的时候,会有一些棘手。你也许会通过System.currentTimeMillis()
来返回1970年1月1日到今天的毫秒数。或者使用Date类来操作日期;当遇到加减月份、天数的时候
你又需要用到Calendar类;当需要格式化日期的时候需要使用java.text.DateFormat类。
现有API存在的问题
线程安全: Date和Calendar不是线程安全的,你需要编写额外的代码处理线程安全问题
API设计和易用性: 由于Date和Calendar的设计不当你无法完成日常的日期操作
ZonedDate和Time: 你必须编写额外的逻辑处理时区和那些旧的逻辑
而java8.0
加入了新的日期API,具体在下:
ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则
Instant: 用来表示时间线上的一个点
LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的
LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的
LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的
Clock: 用于访问当前时刻、日期、时间,用到时区
Duration: 用秒和纳秒表示时间的数量
最常用的就是LocalDate、LocalTime、LocalDateTime了,从它们的名字就可以看出是操作日期
首先来测试一下LocalDate类的常用方法:
测试结果如下:
现在再来测试一下LocalDate类的常用方法:
测试如下:
LocalDateTime类:
测试如下:
来说说日期和时间的加减吧:
三个类:LocalDate、LocalTime、LocalDateTime全部拥有minus()和plus()方法只是参数不好直接调用并传递进去。
更多时候我们是使用以下可以直接手动传递形参进去的方法:
LocalDate:minusDays()、plusDays()。minusMonths()、plussMonths()。用于增加和减少日月信息
LocalTime:minusMinutes()、plusMinutes()。minusHours()、plussHours()。
LocalDateTime:以上均有
LocalDateTime输出的日期时间格式可以自定义:
of和parse方法功能强大,但如果是想将日期以字符串的格式输出,还有用到以下的格式化方法:
另外还提供了与Date类的转化机制类,请参考:https://zhuanlan.zhihu.com/p/28133858?utm_source=qq&utm_medium=social