【问题标题】:firestore sync time between clients客户端之间的firestore同步时间
【发布时间】:2018-10-01 13:00:59
【问题描述】:

我在 Firestore 集合中有这个文档结构

{ message: 'hello world', time: 1538398128 }

时间值由客户端使用此功能发布消息时设置

moment().unix()

问题是我的客户有不同的时间,如果我按时间排序文档就会不一致,就像这个例子

{ message: 'aaa', time: 1538398317 } // client 1 post at 14.00:00
{ message: 'bbb', time: 1538398257 } // client 2 post at 14:00:10

在客户端上,我在“aaa”之前看到“bbb”。 我该如何解决这个问题? 我知道存在 firebase.firestore.FieldValue.serverTimestamp(),但它只有在我发布文档后才给我价值,我不能在客户端上使用它。 谢谢

【问题讨论】:

    标签: javascript reactjs time google-cloud-firestore momentjs


    【解决方案1】:

    您需要选择一个时区并将其用作一致数据存储的标准,否则每个客户端都将使用本地时区。您可能希望使用 moment-timezone 的 momentjs 扩展,您可以在其中指定要使用的时区:https://momentjs.com/timezone/

    【讨论】:

    • 谢谢你的回答,我已经用moment.tz.setDefault('Europe/London')了,但是客户端之间的差是30秒左右
    • 如果 2 个用户“同时”执行一个操作(请记住,2 个客户端提供相同的 Date.now 值是不可能的)他们仍然有 30 秒的差异?跨度>
    • 因为 moment().unix() 获取客户端时间,我的电脑显示 15:30:00 而我的同事显示 15:29:15(客户端不与 NTP 服务器同步)
    • 同样的问题,因为客户端有不同的时间...时刻使用本地客户端日期/时间
    • 是的,但是如果客户在同一个地方,比如办公室,使用时区并不能解决问题
    【解决方案2】:

    不可能将不同的客户端设备(手机/浏览器)与时间完美同步,因为您没有强制它们的时钟同步的机制。

    为确保顺序一致,您需要使用firebase.firestore.FieldValue.serverTimestamp(),一旦提交将返回给客户端。当您等待它时,您可以使用客户端时间作为回退机制。更好的是,您可以联系某个时间服务器,以验证本地时钟没有偏离可用时间太远。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多