java8的日期时间
所属分类 java
浏览量 82
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 实例