这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
Java 8之前操作时间的api是线程不安全的, 为了解决这个问题在Java 8中新增了LocalDate、LocalTime和LocalDateTime。这三个类中内置了变更时间的方法(线程安全),并且内置了安全的格式化方法。
LocalDate:年月日格式的时间类型LocalTime:时分秒格式的时间类型LocalDateTime:年月日时分秒格式的时间类型
创建
这三个APi的操作类似,下图为创建LocalDateTime的方法:
使用示例
- 获取当前时间
调用静态方式
now可以获取当前时间 - 创建指定时间
调用静态方式
of可以创建指定时间 - 根据字符串创建
调用静态方式
parse可以解析字符串创建时间 - 根据
时态对象创建 根据时态对象如LocalDate、LocalTime、LocalDateTime等创建
修改
LocalDate、LocalTime和LocalDateTime都实现了Temporal接口,这个接口定义了修改时间的方法如下图:
调用修改方法不会修改原来的实例,而是返回一个新的实例。也正是如此才保证了线程安全
使用示例
格式化
调用LocalDate、LocalTime、LocalDateTime的format方法可以将实例格式化成指定的字符串。
使用示例
比较
LocalDate、LocalTime、LocalDateTime中可以使用compareTo、isAfter、isBefore进行比较
compareTo:返回值负整数、零或正整数,即此日期小于、等于或大于指定的日期isAfter: 返回值为boolean, 此日期时间是否在指定的日期时间之后isBefore: 返回值为boolean, 此日期时间是否在指定的日期时间之后 此外LocalDate和LocalDateTime还可以使用isEqual比较两个日期是否相等
使用示例
获取年、月、日、星期几、时、分、秒
LocalDate中存在final修饰的年月日变量, LocalTime中存在final修饰的时分秒微秒变量。通过调用对应的get方法可以获取到对应的值。LocalDateTime存在LocalDate和 LocalTime属性也提供了对应的对应的get方法。如下:
-
LocalDate -
LocalTime -
LocalDateTime
使用示例
和Date互转
Date和LocalDate、LocalTime、LocalDateTime没有直接互转的方法,需要借助Instant实现
转Date
LocalDate需要先转成LocalDateTime才能转成Date
LocalDateTime localDateTime = LocalDateTime.now();
Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
Date date = Date.from(instant);
LocalDate localDate = LocalDate.now();
Instant instant1 = localDate.atStartOfDay().toInstant(ZoneOffset.UTC);
Date date1 = Date.from(instant1);