
基础篇:JDK8的日期处理API-必知必备
前言
jdk8之前我们一直在用Date、Calender和SimpleDateFormat,但它的API不够强大,还存在线程安全问题,一直被人诟病。jdk8提供了新的时间API,在java.time包里的类是不可变且线程安全的,它和Joda是同一个作者实现的,因此借鉴了Joda很多特点,如果你用习惯Joda,可以很方便地切换到java.time类的使用
java.time类的简单介绍
- Date和time做下区分,Date(日期)的单位是年月日。time(时间)的单位是时分秒
类 | 描述 |
Instant | 时间戳(瞬时时间,带时区) |
LocalDate | 日期(比如:2018-09-24,不带时区) |
LocalTime | 时间(比如:10:32:10,不带时区) |
LocalDateTime | 日期时间(比如:2018-09-24 10:32:10,不带时区) |
Duration | 两个时间的差,精确到秒或纳秒 |
Peroid | 两个日期的差(精确到日) |
DateTimeFormatter | 日期时间格式化类 |
ZoneId | 时区 |
ZoneOffset | 时区偏移量(比如:+8:00) |
ZonedDateTime | 带时区的日期时间 |
ChronoUnit | 日期枚举类(在时间加减操作可用到) |
MonthDay | 月日 |
YearMonth | 年月 |
Clock时钟
- Clock是关联上时区的时钟,Clock可以获取时间戳和时区ZoneId,用来代替System.currentTimeMillis()和TimeZone.getDefault()。它是个抽象类,一共有四个子类
- 系统默认本地时钟SystemClock
- 偏移时钟OffsetClock
- 周期计时的TickDuration,截取时间到最接近的上个周期或下个周期的时间。注意:TickDuration不会把当前时间点作为周期的起始时间
- 时间不变的FixedInstant
Temporal
- 时间类的统一接口,定义一些通用的方法操作,如:某时间单位的加减,设置为时间域为某一固定值
- Temporal的子类
Instant
- Instant是用来操作时间戳的,带时区,默认UTC的格林威治时区。因此其他时间类和Instant互转时,需要指定自己的时区
- 时间戳的创建
- Instant的使用
LocalTime
- LocalTime是用来操作时分秒的类,外加精确到纳秒级别;无时区概念,转Instant需要先设置时区
- LocalTime的构造方法
- LocalTime与其他时间类的转换
- LocalTime创建示例
- LocalTime的常用处理方法
LocalDate
- LocalDate是用来操作年月日的类;表示的时间单位是截止到日,不包括小时及后面的单位
- LocalDate的创建示例
- LocalDate的操作
LocalDateTime
- 相当于LocalDate 和 LocalTime的结合,用来表示年月日时分秒的类,外加精确到纳秒级别;无时区概念,转Instant需要先设置时区
- LocalDateTime构造示例
- LocalDateTime操作示例
Period和Duration
- Period操作的时间跨度是年月日
- Duration操作的时间跨度是时分秒,外加纳秒
- 使用示例
DateTimeFormatter
- 使用示例
ZoneId和ZoneOffset
- ZoneId表示时区,会根据夏令时调整。在不同年份时间,该ZoneId对应的ZonedDateTime会变动
- ZoneOffset也表示时区,固定时间的偏移。不会根据夏令时调整,固定不变的
ZonedDateTime和OffsetDateTime
- ZonedDateTime,对应ZoneId加LocalDateTime的结合
- OffsetDateTime,对应ZoneOffset加LocalDateTime的结合
- ZonedDateTime和OffsetDateTime使用示例
MonthDay和YearMonth
- 月日的操作类MonthDay
- 年月的操作类YearMonth
- 使用示例
ChronoUnit
- 时间度量单位,枚举类,继承TemporalUnit。它表示的是一个时间间隔用什么单位度量,比如两天的时间间隔可以用48个小时代替表示。一般用于某时间单位的设置,加减操作
ChronoField
- 继承TemporalField,枚举类。和ChronoUnit功能类似,基于TemporalUnit实现,一般用于获取不同时间域的值
- ALIGNED_WEEK_OF_MONTH 和 ALIGNED_DAY_OF_WEEK_IN_MONTH 使用示例
时间转换调整接口:TemporalAdjuster
- 因为java.time的时间类都是不可变,因此需要调整时间时,可调用该方法实现
- jdk提供了一些默认调整方法的工具类TemporalAdjusters
TemporalAdjusters
- 时间调整工具类
- 示例
Date和LocalDateTime互转
- JDK1.8之前用的时间类是Date,为了兼容,我们需要了解一下,Date和LocalDateTime之间的转换
- 示例
参考文章
- JAVA8时间类库与JodaTime[1]
- JDK8 新特性 - 新的时间和日期 API[2]
Reference
[1]JAVA8时间类库与JodaTime:https://blog.csdn.net/zzz_zjz/article/details/93030049
[2]JDK8 新特性 - 新的时间和日期 API:https://blog.csdn.net/qq_37581282/article/details/108610492
文章转载自公众号:潜行前行
