如何在 Java 中将 ZonedDateTime 转换为毫秒?

Posted

技术标签:

【中文标题】如何在 Java 中将 ZonedDateTime 转换为毫秒?【英文标题】:How to convert ZonedDateTime to milliSecond in Java? 【发布时间】:2019-09-02 20:34:43 【问题描述】:

我正在尝试使用以下代码将 ZonedDateTime 转换为毫秒。

LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of(""Asia/Kolkata""));
zonedDateTime.toInstant().toEpochMilli();

但是这个返回基于本地时间的毫秒。而且它没有考虑 ZoneId。

假设LocalDateTime("2019-04-10T05:30")。如果我将其转换为带有区域 ID(“亚洲/加尔各答”)的 ZonedDateTime,那么我将得到("2019-04-10T05:30+05:30[Asia/Kolkata]")。然后我转换为 UTC 中的 EpochMilli (1554854400000) = ("Wed Apr 10 2019 00:00:00")。

【问题讨论】:

你能否澄清一下你得到了什么输出以及你期望什么?有点不清楚代码有什么问题。你这样做的方式应该行得通。 假设 LocalDateTime("2019-04-10T05:30") 。如果我将其转换为具有区域 ID(“亚洲/加尔各答”)的 ZonedDateTime,那么我将得到(“2019-04-10T05:30+05:30[Asia/Kolkata]”)。然后我转换为 UTC 中的 EpochMilli (1554854400000) = ("Wed Apr 10 2019 00:00:00")。 欢迎来到 Stack Overflow。我不清楚你想要达到什么目标,或者你期望的结果是什么。如果您不在亚洲/加尔各答时区,那么您肯定找不到 当前 纪元时间。请您提供更多信息,说明您正在努力实现的目标、您看到的价值以及您期望看到的内容? 嗯,是的,2019-04-10T05:30+05:30 和 2019-04-10T00:00:00Z 代表同一时刻。您期望得到什么结果,为什么? 感谢补充信息。它总是受欢迎的,你应该总是在你的问题中添加它,而不是在评论中。只是这一次我为你做了。 【参考方案1】:

您正在使用Instant 来获取毫秒表示。 Instant 不是基于区域的。现在,纪元时间基于“1970-01-01T00:00:00Z”,因此您不应该在其中包含区域。

如果您想从 epoch 值创建一个 ZoneDateTime,您可以简单地在该 epoch 时间创建一个 Instant,然后使用您希望的区域创建一个 ZonedDateTime

//Let's create our zone time (just to keep your logic
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("Asia/Kolkata"));

//Then get the epoch on GMT
long e = zonedDateTime.toInstant().toEpochMilli();

Instant i = Instant.ofEpochMilli(e);
System.out.println(ZonedDateTime.ofInstant(i, ZoneId.systemDefault()));
System.out.println(ZonedDateTime.ofInstant(i, ZoneId.of("Asia/Kolkata")));

2019-04-12T05:10:31.016+02:00[欧洲/巴黎] 2019-04-12T08:40:31.016+05:30[亚洲/加尔各答]

注意:上面的代码不应该这样使用,没有必要得到一个LocalDateTime然后一个ZonedDateTime来最终创建一个Instant。这只是为了表明即使有一个区域,它也会在某一时刻“丢失”。 只需使用:

long e = Instant.now().toEpochMilli();

【讨论】:

问题是关于将 ZonedDateTime 转换为 milliSec。它在指定时区在哪里转换为 miliSec? 签出这个实际上服务于目的的。 ***.com/questions/22990067/… @MAC,这在我的脑海中并不新鲜,但这里的重点是证明预期值不是“基于区域的”。请注意,您共享的解决方案确实有效(以秒为单位),但它变成了“分区时代时间”,可能会提供一些稍后需要转换的问题。仅仅因为您需要数值和区域才能使用它。【参考方案2】:
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("UTC"));
zonedDateTime.toInstant().toEpochMilli();

【讨论】:

欢迎来到 SO!您能否解释一下这是如何解决问题的,以及为什么它是帮助 OP 和未来访问者的好解决方案?谢谢。

以上是关于如何在 Java 中将 ZonedDateTime 转换为毫秒?的主要内容,如果未能解决你的问题,请参考以下文章

Java 8:如何从 Epoch 值创建 ZonedDateTime?

如何使用 ZonedDateTime 或 Java 8 将任何日期时间转换为 UTC

在 java.time 中的 ZonedDateTime 上设置时间?

Java 8 Time API - ZonedDateTime - 解析时指定默认 ZoneId

如何从 org.joda.time.DateTime 转换为 java.time.ZonedDateTime

java中将RFC1123日期时间格式化