为什么 JDK 1.8 之前的时间与日期 API 不好用?
1、java.util.Date 是从 JDK 1.0 开始提供,易用性差
默认是中欧时区(Central Europe Time)
起始年份是 1900 年
起始月份从 0 开始
对象创建之后可修改
2、JDK 1.1 废弃了 Date 中很多方法,新增了并建议使用 java.util.Calendar 类
相比 Date 去掉了年份从 1900 年开始
月份依然从 0 开始
选用 Date 或 Calendar,让人更困扰
3、DateFormat 格式化时间,线程不安全
为了解决 JDK 中时间与日期较难使用的问题,JDK 1.8 开始,吸收了 Joda-Time 很多功能,新增 java.time 包,加了新特性:
区分适合人阅读的和适合机器计算的时间与日期类
日期、时间及对比相关的对象创建完均不可修改
可并发解析与格式化日期与时间
支持设置不同的时区与历法
LocalDate | 本地日期 |
LocalTime | 本地时间 |
LocalDateTime | 本地日期+时间 |
Instant | 时间戳,适合机器时间计算 |
Duration | 时间差 |
Period | 年、月、日差 |
ZoneOffset | 时区偏移量 |
ZonedDateTime | 带时区的日期时间 |
Clock | 时钟,获取其他地区时钟 |
DateTimeFormatter | 时间格式化 |
Temporal | 日期-时间获取值的字段 |
TemporalAdjuster | emporal 对象转换,实现自定义 |
ChronoLocalDate | 日历系统接口 |
常用 api
1、 获取当前日期
LocalDate.now()
2、创建日期
LocalDate date = LocalDate.of(2020, 9, 21)
3、获取年份
date.getYear()
//通过 TemporalField 接口的实现枚举类 ChronoField.YEAR 获取年份
date.get(ChronoField.YEAR)
4、获取月份
date.getMonth().getValue()
//通过 TemporalField 接口的实现枚举类 ChronoField.MONTH_OF_YEAR 获取月份
date.get(ChronoField.MONTH_OF_YEAR)
5、获取日
date.getDayOfMonth()
//通过 TemporalField 接口的实现枚举类 ChronoField.DAY_OF_MONTH 获取日
date.get(ChronoField.DAY_OF_MONTH)
6、获取周几
date.getDayOfWeek()
7、获取当前月多少天
date.lengthOfMonth()
8、获取当前年是否为闰年
date.isLeapYear()
9、当前时间
LocalTime nowTime = LocalTime.now()
10、创建时间
LocalTime.of(23, 59, 59)
11、获取时
nowTime.getHour()
12、获取分
nowTime.getMinute()
13、获取秒
nowTime.getSecond()
14、获取毫秒
nowTime.getLong(ChronoField.MILLI_OF_SECOND)
15、获取纳秒
nowTime.getNano()
16、创建日期时间对象
LocalDateTime.of(2020, 9, 21, 1, 2, 3);
LocalDateTime.of(date, nowTime);
17、获取当前日期时间对象
LocalDateTime.now()
18、通过 LocalDate 创建日期时间对象
date.atTime(1, 2, 3)
19、通过 LocalTime 创建日期时间对象
nowTime.atDate(date)
20、通过 LocalDateTime 获取 LocalDate 对象
LocalDateTime.now().toLocalDate()
21、通过 LocalDateTime 获取 LocalTime 对象
LocalDateTime.now().toLocalTime()
22、解析日期字符串
LocalDate.parse("2020-09-21")
23、解析时间字符串
LocalTime.parse("01:02:03")
24、解析日期时间字符串
ConstXiong 备案号:苏ICP备16009629号-3