【问题标题】:offset current system time to time zone GMT in millisecs以毫秒为单位偏移当前系统时间到时区 GMT
【发布时间】: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

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

【问题讨论】:

标签: java timezone gmt


【解决方案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 点)发布,因此您的所有结果都不太适合那个时间。从运行代码到发布问题需要几个小时;或者您的计算机时钟设置不正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 2012-02-23
      • 2011-10-25
      相关资源
      最近更新 更多