如何在 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