【问题标题】:How to set the date of messages sent and received for exact time zone date time?如何为确切的时区日期时间设置发送和接收消息的日期?
【发布时间】:2022-06-11 01:19:13
【问题描述】:

我正在尝试创建一个消息应用程序,但问题是如果其中一个用户没有正确设置时间(例如少 1 分钟),则对消息进行排序。那么如何设置一个默认时区,我可以根据这个时区日期时间而不是本地(设备)时间来设置消息的日期?我尝试使用 Timestamp.now()、NTP (如果我使用正确,则为 idk,但它也正在获取本地时间) FieldValue.serverTimeStamp(); (那是返回实例并且日期不起作用)。我该如何解决这个问题?

【问题讨论】:

    标签: flutter dart time


    【解决方案1】:

    每当您节省时间时,都需要在 UTC 中花时间,如下所示

    DateTime.now().toUtc()
    

    这种方法可能还有一个问题。当用户禁用自动时间设置并在设置中手动调整时间时,也可能导致数据不一致。为了解决这个问题,你可以尝试一些像 worldclockapi.org 这样的 api。但是首先获取时间然后保存在数据库中会有一个小的网络延迟。除非您有服务器并将其保存在数据库中,否则这基本上是一种权衡。

    【讨论】:

    • 我如何使用 worldclockapi?因为我尝试使用 final response = http.get(url) 并使用 json 确实获得了 dateTime,但是当我第一次发送消息时它可以工作,但之后来自用户 x 的所有消息都具有相同的日期时间和来自用户 y 的所有消息也有相同的时间。看起来我必须使用监听器来更改数据,因为我刚刚初始化了函数,但我不知道该怎么做。你能帮我吗?
    • 在每条消息发送时,您可能需要获取时间
    【解决方案2】:

    使用 dart ntp 包来执行此操作。

    DateTime sendTimestamp = await NTP.now();
    print('Send timestamp: ${sendTimestamp}');
    

    每次我们需要从设备发送时间戳,只需从NTP.now()获取。

    然后在用户应用程序之间同步时区,使用timezone 包。

    final detroit = tz.getLocation('America/Detroit');
    final timeZone = detroit.timeZone(sendTimestamp.millisecondsSinceEpoch);
    print(timeZone);
    

    【讨论】:

    • timeZone 没有返回日期,如何在用户应用程序之间同步时区?
    • 使用 setLocalLocation 并将您的所有 DateTime 类更改为 TZDateTime
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多