zoneId、ZoneOffset、Date、LocalDateTime、ZonedDateTime、OffsetDateTime的区别

本文探讨了Java中ZoneId、ZoneOffset和TimeZone在处理时区信息方面的差异,重点介绍了ZoneId和ZoneOffset的新旧对比,以及如何在LocalDateTime、ZonedDateTime和OffsetDateTime/OffsetTime类中灵活运用它们处理日期和时间,包括时区转换和偏移量的应用。

1、zoneId
2、ZoneOffset继承了zoneId

3、ZoneOffset 和 TimeZone区别

ZoneOffset 和 TimeZone 是 Java 编程语言中处理时区信息的两个不同的类。

ZoneOffset 类:

ZoneOffset 是 Java 8 中引入的日期时间 API 的一部分,位于 java.time 包中。
它代表了与协调世界时(UTC)之间的固定时间偏移,以固定的小时和分钟表示。
例如,+02:00 表示时间比协调世界时快 2 小时。
TimeZone 类:

TimeZone 是旧的日期时间 API 中的类,位于 java.util 包中。
它用于表示时区信息,包括时区偏移、夏令时规则等。
TimeZone 类在 Java 1.0 中引入,但在 Java 8 之后,新的日期时间 API 提供了更先进和更安全的替代方案。
关系:

ZoneOffset 和 TimeZone 都与时区有关,但它们表示时区信息的方式不同。

ZoneOffset 表示一个固定的时区偏移,而 TimeZone 表示一个完整的时区,包括可能的夏令时规则。
在新的日期时间 API 中,更推荐使用 ZoneOffset 或 ZoneId(ZoneId 是 ZoneOffset 的父接口,也可以表示命名的时区,比如 “Europe/Paris”)。
如果你必须与旧的代码或库一起工作,可能需要进行一些转换,可以使用 ZoneId.of(“ZoneOffset”) 将 ZoneOffset 转换为 ZoneId。反之亦然。

ZoneOffset是JAVA8的API,他也包含了当地时间和UTC的偏移量。

TimeZone 这个是旧的,它包含了时区信息,偏移量等。


Date 和 LocalDateTime 是 Java 编程语言中处理日期和时间的两个不同的类。

Date 类:

Date 类是 Java 中用于表示日期和时间的类,它在 Java 1.0 中引入,但在 Java 8 之后已被大部分新的日期时间 API 所取代。
Date 类封装了自1970年1月1日UTC(协调世界时)开始的毫秒数。
这个类有一些问题,比如它是可变的,而且存在时区问题,因此在新的应用中更常用其他日期时间类。
LocalDateTime 类:

LocalDateTime 是 Java 8 中引入的日期时间 API 的一部分,位于 java.time 包中。
LocalDateTime 表示不带时区的日期和时间,即它不考虑时差或夏令时等问题。
该类提供了更丰富的日期和时间操作方法,同时是不可变的,因此更适合在多线程环境中使用。
关系:

Date 类和 LocalDateTime 类都用于表示日期和时间,但它们分别属于不同的日期时间 API。
在使用新的日期时间 API 时,推荐使用 LocalDateTime,因为它提供更强大和更安全的操作,并且考虑了一些 Date 类的问题。
如果你必须与旧的代码或库一起工作,可能需要在它们之间进行转换。可以使用 Date 类的 toInstant() 方法将其转换为 Instant,然后再通过 Instant 转换为 LocalDateTime。反之亦然。

小结:Date的老的日期API,LocalDateTime是JDK8的AIP, Date包含了时间戳,并且是UTC+时区的时间。

LocalDateTime 表示不带时区的日期和时间,所以他不用考虑时区带来的问题。

一、ZoneId and Offset

  1. ZoneId 表示时区,比如上海,北京、京东等等,当然既然知道时区,自然也就知道偏移量。
  2. ZoneOffset 表示偏移量,就是格林威治/ UTC时间的时区偏移量。这里不包含时区,因为同一个偏移量,可能会有多个时区,比如北京和上海的市区偏移量是一样的,但是他们属于不同的时区

ZoneId.getAvailableZoneIds(); 这个可以获取所有时区

ZoneId and Offset要配合时间类来使用,常用的时间类有下面3种

  • ZonedDateTime 使用格林威治/ UTC 的时区偏移量处理具有相应时区的日期和时间。
  • OffsetDateTime 使用格林威治/ UTC 的相应时区偏移量处理日期和时间,但不包含时区 ID。
  • OffsetTime 使用格林威治/ UTC 的相应时区偏移量处理时间,但不包含时区 ID。

二、ZonedDateTime

ZonedDateTime是结合了LocalDateTime类与zoneId类

前面介绍了LocalDateTime是不包含偏移量,也不好时区,就是一个时间,所以LocalDateTime可以很好的和zoneId或者ZoneOffset类一起使用

下面代码通过LocalDateTime+ZoneId得到ZonedDateTime

LocalDateTime leaving = LocalDateTime.of(2013, Month.JULY, 20, 19, 30);
ZoneId leavingZone = ZoneId.of("America/Los_Angeles");
ZonedDateTime departure = ZonedDateTime
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值