以毫秒为单位偏移当前系统时间到时区 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的主要内容,如果未能解决你的问题,请参考以下文章