🗒️Java8 中的时间 API
2024-1-7
| 2024-1-8
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password

背景

JDK8 以前使用的时间相关类主要是 Date、Calendar、SimpleDateFormat 三个。
而 JDK8 新增的时间相关类包括
  • LocalDate\LocalTime\LocalDateTime
  • ZoneId\ZoneDataTime
  • Instant
  • DataTimeFormatter
  • Period\Duration 等。
那么为什么会增加这么多的类呢,主要有下面几个原因:
  1. 只能精确到毫秒值
  1. Date 类型是可变的
  1. 存在线程不安全的问题
比如说下面这段代码,当我们修改了 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。

参考资料

提供一个学习视频
 
MySQL 中的时间字段踩坑记录
Loading...
目录