java - 即时与 ZoneDateTime。转换到另一个时区

标签 java timezone java-time date-conversion zoneddatetime

我很难理解 ZoneDateTime - Instant - LocalDateTime 之间的 java.time ,到目前为止,我唯一知道的是:

  • 介于两者之间的即时工作
  • 即时(以我的理解),是从时间(UTC)那一刻开始的时间印记,是与人类时间流动相关的时间印记,但没有时区
  • 区域日期时间有时区
  • Instant 没有时区,但可以在提供时区信息的情况下处理它
  • LocalDate 时间没有时区,也无法处理区域,它是一个日期时间,与整个时间流(全局)的延续没有任何关系。

所以我有下面的转换

val seoul = "Asia/Seoul"

val zoneId = ZoneId.of(seoul)
val now = ZonedDateTime.now()

val convertedZoneDateTIme = ZonedDateTime.of(now.toLocalDateTime(), zoneId).withZoneSameInstant(ZoneOffset.UTC)
val convertedInstant = now.toInstant().atZone(zoneId)

// expected output
println(convertedInstant.format(DateTimeFormatter.ofPattern(format)))

// not expected output
println(converted.format(DateTimeFormatter.ofPattern(format)))

输出

2021-05-02 03:15:13
2021-05-02 09:15:13

我正在尝试将给定时间转换为另一个时区,这是一个用户移动到不同时区并且我需要更新有关存储日期的所有信息的用例。

为什么我在第二个上得到的值不正确..?为什么我必须先将其转换为 Instant 然后再进行转换?

提前谢谢

最佳答案

你的大部分要点都是完全正确的。只是你不应该使用 Instant用于在 LocalDateTime 之间工作和ZonedDateTime正如你在第一条子弹中所说的那样。之间转换 InstantLocalDateTime需要一个时区(或至少与 UTC 的偏移量),因此应该通过 ZonedDateTime 。所以ZonedDateTime是在另外两个之间使用的一个。正如我所说,其余的都是正确的。

您并不完全清楚您对代码的期望,也不清楚更具体地观察到的结果有何不同。假设您想在整个过程中使用相同的时间点,这一行就是让您感到惊讶的地方:

val convertedZoneDateTIme = ZonedDateTime.of(now.toLocalDateTime(), zoneId).withZoneSameInstant(ZoneOffset.UTC)

nowZonedDateTime在您自己的时区(准确地说是您的 JVM 的默认时区)。通过仅从中获取日期和时间并将它们与不同的时区结合起来,您可以保留一天中的时间,但以这种方式(可能)改变时间流动中的点。接下来,您将转换为 UTC,保留时间点(即时),从而(可能)更改一天中的时间,甚至可能更改日期。您从 ZonedDateTime 中一无所获。这是你的出发点,我看不出这个操作有什么意义。转换now对于 UTC 将时间点保留在时间线上,使用更简单的方法:

val convertedZoneDateTIme = now.withZoneSameInstant(ZoneOffset.UTC)

通过此更改,您的两个输出在时间点上一致。示例输出:

2021-05-07 02:30:16 +09:00 Korean Standard Time
2021-05-06 17:30:16 +00:00 Z

我用了formatuuuu-MM-dd HH:mm:ss xxx zzzz .

对于您的其他转换,我更愿意使用 withZoneSameInstant() 。那么我们就不需要通过 Instant .

val convertedInstant = now.withZoneSameInstant(zoneId)

它给出的结果与您的代码相同。

对所讨论的每个类的内容的简短概述:

<表类=“s-表”> <标题> 类(class) 日期和时间 时间点 时区 <正文> ZonedDateTime 是 是 是 Instant - 是 - LocalDateTime 是 - -

基本上你对 LocalDateTime 没有任何用处为了您的目的,以及Instant ,虽然可用,但不是必需的。 ZonedDateTime独自满足您的需求。

关于java - 即时与 ZoneDateTime。转换到另一个时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67354275/

相关文章:

java - 如何将对象的 sql 时间转换为 java 时间?

java - JSR-310 中两种不同的基于周的年定义的动机是什么?

java - JPanel 无法添加到 JFrame 构造函数之外的 JLayeredPane

java - 没有数据库时使用 ADF 模型层的好处

java - 如何从时区获取时区 ID

php - 如何获取客户的时区?

javascript - 根据从 UI 中选择的时区过滤 php 中的日期

java - Sonar maven 插件在 Java 主文件 AST 扫描期间挂起

java - 如何处理以下查询

java - 无法将字符串解析为 LocalDate (Java 8)