【问题标题】:How to convert ZonedDateTime to milliSecond in Java?如何在 Java 中将 ZonedDateTime 转换为毫秒?
【发布时间】: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 代表同一时刻。您期望得到什么结果,为什么?
  • 感谢补充信息。它总是受欢迎的,你应该总是在你的问题中添加它,而不是在评论中。只是这一次我为你做了。

标签: java epoch zoneddatetime


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

【讨论】:

  • 欢迎来到 SO!您能否解释一下这是如何解决问题的,以及为什么它是帮助 OP 和未来访问者的好解决方案?谢谢。
猜你喜欢
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多