目录
一 java.time背景
用过 java.util.Date 和 java.sql.Date 的或多或少都会觉得这这两个日期 API 包设计的太不友好,太反人类。比如:
- 什么 java.util.Date 是可变类型;
- SimpleDateFormatter 不是线程安全的;
- 甚至 java.util.Date 月份从0开始,一月是0,十二月是11等等。
为了解决这些痛点,Java 8 的 java.time 包出现了,该包下的所有类都是不可变类型,而且都是线程安全的。
你可能会发现该包的很多 API 与 JodaTime 类似,因为 Java 8 的时间包设计参考了 JodaTime 设计。
二 java.time重点类
下面我们简单了解一下java.time包下一些重点类:
Clock:时钟,比如获取当前中国北京的时间。
Instant:时间戳。
Duration:持续时间,用于计算时间差。
LocalDate:只包含日期,比如:2021-01-17 。
LocalTime:只包含时间,比如:14:15:10。
LocalDateTime:同时包含日期和时间,比如:2021-01-170 14:15:10。
Period:时间段,用于计算时间差。
ZoneOffset:时区偏移量,比如:+8:00。
ZonedDateTime:带时区的时间。
java.time包下,
其他都是一些很简单的类,都是比较见名知意的。
三 java.time
基本操作
3.1 创建日期
//当前日期
LocalDate localDate = LocalDate.now();
//指定日期
LocalDate localDate = LocalDate.of(2021, 01, 17);
3.2 创建时间
//当前时间
LocalTime localTime1 = LocalTime.now();
//指定时间
LocalTime localTime2= LocalTime.of(15, 11, 15);
3.3 创建日期和时间
LocalDateTime localDateTime = LocalDateTime.now();
3.4 获取年
//今年
int now = LocalDate.now().getYear()
//明年
int after = LocalDate.now().plusYears(1).getYear();
//去年
int before = LocalDate.now().minusYears(1).getYear();
3.5 获取月
//这个月
int now = LocalDate.now().getMonthValue()
//下个月
int after = LocalDate.now().plusMonths(1).getMonthValue();
//上个月
int before = LocalDate.now().minusMonths(1).getMonthValue();
3.6 获取日
//今天
int