type
status
date
slug
summary
tags
category
icon
password
背景
JDK8 以前使用的时间相关类主要是 Date、Calendar、SimpleDateFormat 三个。
而 JDK8 新增的时间相关类包括
- LocalDate\LocalTime\LocalDateTime
- ZoneId\ZoneDataTime
- Instant
- DataTimeFormatter
- Period\Duration 等。
那么为什么会增加这么多的类呢,主要有下面几个原因:
- 只能精确到毫秒值
- Date 类型是可变的
- 存在线程不安全的问题
比如说下面这段代码,当我们修改了 date 数据以后,就再也拿不到原来的时间信息了。
时间戳
时间戳是以GMT/UTC时间「1970-01-01T00:00:00」为起点,到当前具体时间的秒数(不考虑闰秒)。
在 Java8 中,使用 Instant 类记录时间戳,拓展记录精度达到了纳秒。
可以看到,秒跟纳秒的信息分开存储,并且是不可变对象。
输出的时间字符串中,T表示分隔符,Z表示的是UTC。
本地时间
LocalDateTime\LocalDate\LocalTime
代表本地时间,也就是我们日常交流表达用的时间。
- LocalDateTime 最完整,包括年月日时分秒纳秒
- LocalDate 包含年月日
- LocalTime 包含时分秒纳秒
带时区时间
时区,是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。理论时区以被15整除的经线为中心,向东西两侧延伸7.5度,即每15°划分一个时区,这是理论时区。理论时区的时间采用其中央经线(或标准经线)的地方时。所以每差一个时区,区时相差一个小时,相差多少个时区,就相差多少个小时。
在 Java 中使用 ZoneId 代表时区信息。
使用 ZonedDateTime 可以得到包装为指定时区的时间数据。
例如下面的程序,我们当前所在的时区是Asia/Shanghai(UTC+8),可以创建出加一个小时的时区时间。
格式化
使用 DataTimeFormatter 替换 SimpleDateFormat。
参考资料
提供一个学习视频