以毫秒为单位偏移当前系统时间到时区 GMT

Posted

技术标签:

【中文标题】以毫秒为单位偏移当前系统时间到时区 GMT【英文标题】:offset current system time to time zone GMT in millisecs 【发布时间】:2019-12-26 03:47:47 【问题描述】:

我正在尝试修改现有的 java 代码,以毫秒而不是秒为单位输出数据。

以秒为单位返回当前时间的现有代码:

currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);

输出currentTime = 1566311076

使用纪元转换器它说

GMT: Tuesday, August 20, 2019 2:24:36 PM
Your time zone: Tuesday, August 20, 2019 7:24:36 AM GMT-07:00 DST

我尝试修改 java 代码以在 GMT 中返回当前时间(以毫秒为单位)能够以毫秒为单位获取当前系统时间,但是我如何将结果偏移到 GMT 时间。

currentTime = ZonedDateTime.now().toInstant().toEpochMilli();

输出currentTime = 1566336256566

假设这个时间戳是以毫秒为单位的

GMT: Tuesday, August 20, 2019 9:24:16.566 PM
Your time zone: Tuesday, August 20, 2019 2:24:16.566 PM GMT-07:00 DST

你知道吗,会非常感激。谢谢!

【问题讨论】:

How to find epoch format current time of GMT using java 可能几乎重复 【参考方案1】:

先转换为Instant

currentTime = LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()

演示

System.out.println(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
System.out.println(LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli());

输出

1566323773
1566323773363

【讨论】:

【参考方案2】:

当一个简单的存在时,为什么要以更复杂的方式呢?

    long currentTime;
    currentTime = System.currentTimeMillis();
    System.out.println(currentTime);

刚才的示例输出:

1566369127348

我强烈支持使用现代 java.time 类,包括 ZonedDateTime(可能不是那么多 LocalDateTime)。然而,在这种情况下,Java 诞生时的一个简单方法给了我们想要的东西。我认为使用它没有问题。如果您确实想使用 java.time,请使用 Instant:

    currentTime = Instant.now().toEpochMilli();
    System.out.println(currentTime);

1566369127348

你的代码出了什么问题?

奇怪的是您的旧代码不正确。您的新尝试给出了自纪元以来的正确毫秒数。您的旧代码是:

    currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);

这将采用您所在时区的当前挂钟时间,或者更准确地说,采用您的 JVM 的默认时区。然后它不正确地假设时间是 UTC,并根据这个假设将它转换为自纪元以来的秒数(当然,如果 JVM 的时区是 UTC,你会碰巧得到正确的结果)。

我建议您始终将时区(如果不是时钟)传递给 now 方法,以明确您对所使用时区的期望。 no-arg now 使用JVM的默认时区,这是不可靠的,因为设置可能会被意外更改,并且可能会引起混乱。如果在上面的代码行中已经说明了时区,我们都可以一眼看出它是否与后来假设的 UTC 一致。例外是 Instant.now():它不需要时区,因为它在所有时区给出相同的结果。

我在欧洲/哥本哈根时区的计算机上的旧代码输出为:

1566376327

您可以看到它与我们之前得到的毫秒值不一致(在这种情况下是提前两个小时;在您的情况下是晚了 7 小时)。

您的问题似乎已在格林威治标准时间晚上 10 点 (22:00) 左右(偏移量 -07:00 下午 3 点)发布,因此您的所有结果都不太适合那个时间。从运行代码到发布问题需要几个小时;或者您的计算机时钟设置不正确。

【讨论】:

以上是关于以毫秒为单位偏移当前系统时间到时区 GMT的主要内容,如果未能解决你的问题,请参考以下文章

使用偏移量计算 JavaScript 日期时间

JS:如何获取时区

MySQL 查询当前 GMT 时间

如何在Elm中以GMT显示当前时区偏移量

Python - 给定时间戳UTC和UTC偏移量的时区名称

从时区偏移本地化日期时间(时区感知)