即时 vs ZoneDateTime转换到另一个时区

问题描述

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

  • 介于两者之间的即时作品
  • Instant(在我的理解中),是从时刻 (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 并继续转换?

提前致谢

解决方法

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

您并没有完全清楚您对代码的期望,或者更具体地观察到的结果有何不同。假设您想在整个过程中使用相同的时间点,这条线就是您出乎意料的地方:

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

now 是您自己时区(准确地说是 JVM 的默认时区)中的 ZonedDateTime。通过仅从中获取日期和时间并将它们与不同的时区结合起来,您可以保持一天中的时间,但以这种方式(可能)改变时间流中的点。接下来,您将转换为 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)

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

简要概述所讨论的每个课程的内容:

班级 日期和时间 时间点 时区
ZonedDateTime
Instant - -
LocalDateTime - -

基本上,您对 LocalDateTime 没有任何用处,而且 Instant 虽然可用,但不是必需的。 ZonedDateTime 就可以满足您的需求。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...