首页  

java8的日期时间     所属分类 java 浏览量 93
LocalTime
只用于表示时间,HH:mm:ss 
它不带日期、时区等信息
另外它支持到纳秒级。
但因为它是Local的,即它代表的是本地时间,也就是表示的其实是经过 zone offset 处理后的时间,
但因为处理完了后,又不保留 zone offset信息,所以说它是不带 zone的时间。
它里面存储了当地  hour, minute, sencond, nanos


LocalDate
只用于表示日历, yyyy-MM-dd    
它不带时间、时区等信息
但因为它是Local的,即它代表的是本地日期,也就是表示的其实是经过 zone offset 处理后的日期,
但因为处理完了后,又不保留 zone offset信息,所以说它是不带 zone的日期。
它里面存储了当地  year, month, dayOfMonth


LocalDateTime
用于表示 日期、时间,但它不带 时区信息
也可以理解成: LocalDateTime = LocalDate + LocalTime
所以它是 java.util.Date 的替代品,并且支持纳秒,java.util.Date 是不支持纳秒的
但因为它是Local的,即它代表的是本地时间,也就是表示的其实是经过 zone offset 处理后的时间,
但因为处理完了后,又不保留 zone offset信息,所以说它是不带 zone的时间。
如果想要根据它来获取UTC时间,需要调用 toEpochSeconds(ZoneOffest), 因为它不保留offset,所以 要把offset 作为参数传给它。


ZonedDateTime
用于表示 日期、时间,但它带 时区信息
也可以理解成:ZonedDateTime = LocalDateTime + ZoneId= LocalDate + LocalTime + ZoneId
所以它是 java.util.Calendar 的替代品


OffsetDateTime
用于表示 日期、时间,但它带 offset 信息
也可以理解成:OffsetDateTime = LocalDateTime + ZoneOffset= LocalDate + LocalTime + ZoneOffset
相比 LocalDateTime, 它保留了与 UTC时间的 offset
TimeZone vs ZoneId, ZoneOffset
TimeZone = ZoneId + ZoneOffset
ZoneId 只有 id, 是个字符串,例如  Europe/Paris.
ZoneOffset 只有 offset (一个数字,或者用 + - 符号表示的 一个人为刻度的偏移量,内部仍旧会被 计算为偏离量,并且是以  秒 s 为标准)


java.util.Calendar 和 Java8 的API,都是不带 Locale 信息的,只有在 format, parse 时,才会带有 Locale信息 Java8 推荐使用 LocalDateTime,而不是Date 获取 year, month, dayOfMonth, hour, minute, second, nanos ,直接使用 LocalDateTime,对象在创建时,这些字段已经计算好了。 从 Date中获取这些字段,还要经过一番计算
java.util.Date Java早期引入的日期和时间类,用于表示特定的时间点,精确到毫秒。 Date类提供了各种方法来获取、设置和操作日期和时间。 然而,由于其设计上的缺陷,如易变性和非线程安全,它在Java 1.0和1.1中被废弃,并被Calendar类取代 java.util.Calendar 为了解决Date类的不足而引入的,Calendar类提供了一种更灵活的方式来处理日期和时间,允许用户设置特定的日期和时间字段,并进行日期和时间的计算。 然而,使用Calendar类编写代码时容易出错,因为它需要处理多个字段,并且在进行日期和时间计算时需要更多的代码。 java.time.LocalDateTime LocalDateTime是Java 8引入的新日期和时间类。它用于表示一个不带时区的日期和时间值。 LocalDateTime提供了强大的日期时间处理功能,包括创建日期时间对象、格式化和解析日期时间、计算日期时间差值、调整日期时间等。 与Date和Calendar相比,LocalDateTime更易于使用,并且提供了更好的性能和更丰富的功能。 java.util.Date 和java.util.Calendar 是Java早期的日期和时间处理类,它们在设计上存在一些缺陷,如易变性和非线程安全。 而LocalDateTime是Java 8引入的新API的一部分,提供了更强大、更灵活和更易于使用的日期时间处理功能。 现代Java开发中,推荐使用LocalDateTime来处理日期和时间。
import java.time.Instant; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZonedDateTime; System.out.println(LocalDateTime.now()); System.out.println(Instant.now()); System.out.println(OffsetDateTime.now()); System.out.println(ZonedDateTime.now()); 2024-08-25T07:47:42.110 2024-08-24T23:47:42.110Z 2024-08-25T07:47:42.136+08:00 2024-08-25T07:47:42.136+08:00[Asia/Shanghai]
final ZoneId zoneId = ZoneId.systemDefault(); System.out.println(zoneId); System.out.println(ZoneOffset.UTC); final Instant instantNow = Instant.now(); final ZoneOffset zoneOffset = ZoneId.systemDefault().getRules().getOffset(instantNow); System.out.println(zoneOffset); final LocalDateTime localDateTimeNow = LocalDateTime.ofInstant(instantNow,zoneId) ; OffsetDateTime offsetDateTimeNow = OffsetDateTime.ofInstant(instantNow,zoneId); ZonedDateTime zonedDateTimeNow = ZonedDateTime.ofInstant(instantNow,zoneId); System.out.println(instantNow); System.out.println(localDateTimeNow); System.out.println(offsetDateTimeNow); System.out.println(zonedDateTimeNow); System.out.println(instantNow.toEpochMilli()); System.out.println(localDateTimeNow.toInstant(zoneOffset).toEpochMilli()); System.out.println(offsetDateTimeNow.toInstant().toEpochMilli()); System.out.println(zonedDateTimeNow.toInstant().toEpochMilli()); Asia/Shanghai Z +08:00 2024-08-25T00:10:20.548Z 2024-08-25T08:10:20.548 2024-08-25T08:10:20.548+08:00 2024-08-25T08:10:20.548+08:00[Asia/Shanghai] 1724544620548 1724544620548 1724544620548 1724544620548

上一篇     下一篇
hutool JWT 例子

springboot jpa 实例

Java各种数据对象转换框架

java.time.Instant 说明

java 各种日期时间转换

jdbc spi 实例