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



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

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

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

你知道吗,会非常理解这一点。谢谢!

首先转换为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

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

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-argnow使用 JVM 的缺省时区,这是不可靠的,因为设置可能会意外更改,并且可能会导致混淆。如果在上面的代码行中说明了时区,我们所有人都可以一目了然地看到它是否与后来假设的 UTC 一致。例外是Instant.now():它不需要时区,因为它在所有时区都给出相同的结果。

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

1566376327

你可以看到它与我们之前得到的毫秒值不一致(在本例中提前了两个小时;在你的例子中,它落后了 7 小时(。

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

最新更新