gpt4 book ai didi

java时区混淆。据称持有 UTC 时区的两个时间戳相差近 2 小时

转载 作者:行者123 更新时间:2023-12-02 01:18:25 25 4
gpt4 key购买 nike

我使用的代码为:

import java.time.LocalDateTime
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter
var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
LocalDateTime.now(ZoneOffset.UTC).format(formatter)
LocalDateTime.now().format(formatter)

在 Android 应用程序中生成 UTC 格式的事件时间时间戳。

示例输出可能是:

2019-09-30T19:19:49.133 # the app (UTC)
2019-09-30T21:19:49.398 # my current time zone

现在,当将其推送到云消息存储(Azure 事件中心)时,会添加一个以 UTC 表示提交时间的字段(enqueuedtimeutc, https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.eventhubs.eventdata.systempropertiescollection.enqueuedtimeutc?view=azure-dotnet )

但是,在计算距离时,两个按 UTC 传输的时间戳之间存在近 2 小时的偏移:

distance(s)  frequency
7194.0 0.350518
7196.0 0.133110
7195.0 0.084421
7199.0 0.077668
7193.0 0.075642

这该如何解释呢?我认为这两个时间戳都是 UTC 时间。事实上,示例输出似乎工作正常。

我的 Android 设备上的时钟是否相差 2 小时(也不太可能,因为智能手机通常会自行与时钟同步)。为什么时差不完全是 2 小时 * 60 分钟 * 60 秒 = 7200 秒而是更低?由于需要增加延迟和处理时间,我预计该值会更大。

编辑

也许使用更好:

DateTimeFormatter.ISO_INSTANT.format(Instant.now())

但这不应该改变任何东西,即与我的时间输出完全匹配(除了格式字符串)。

最佳答案

I thought that both timestamps are in UTC.

不完全是。

永远不要调用LocalDateTime.now我无法想象这种情况有意义。当然不是在这种情况下。

该类缺乏任何时区或与 UTC 的偏移量的概念。所以它不能用来追踪某个时刻。 LocalDateTime 仅包含日期和时间。因此,如果您使用 LocalDateTime 捕获 America/Montreal 2020 年 1 月 23 日中午的当前时刻,您就丢弃了蒙特利尔信息。所以我们只剩下日期和时间。我们不再知道你指的是日本东京的中午,突尼斯突尼斯的中午,还是美国加利福尼亚州洛杉矶的中午——所有这些时刻都截然不同,而且都不是你的初衷。我们失去了你的初衷。

确实通过传递 ZoneOffset.UTC 捕获了 UTC 中的日期和时间,但使用 LocalDateTime 不会添加任何内容值(value),只是分散注意力或可能是意想不到的值(value)。

即时

要捕获 UTC 中的当前时刻,请使用Instant

Instant instant = Instant.now() ;  // Capture the current moment as seen in UTC.

ISO 8601

表示此类值的标准方法是使用 ISO 8601格式,以 +00:00 结尾(相对 UTC 的零时分秒),或其缩写 Z(发音为“Zulu”)。

String output = Instant.toString() ;   // Generate string in standard ISO 8601 format.

2019-09-30T20:04:56.827546Z

如果您的数据接收器无法处理微秒,您可能需要截断为毫秒。

Instant instant = Instant.now().truncatedTo( ChronoUnit.MILLIS ) ;  // Lop off the microseconds, keeping milliseconds. 

解析。

Instant instant = Instant.parse( "2019-09-30T20:04:56.827546Z" ) ;

我无法提供更多帮助,因为我不使用 Android 或 Azure,而且您没有描述足够的详细信息。

Now when pushing it to a cloud message store (azure event hub),

推什么?通过什么API调用?您的链接指向 C# 页面,而不是 Java 页面。该页面似乎是 getter 而不是 setter(不确定,我不读 C#)。

关于java时区混淆。据称持有 UTC 时区的两个时间戳相差近 2 小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58174492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com