【问题标题】:Convert date object to Firestore timestamp将日期对象转换为 Firestore 时间戳
【发布时间】:2019-05-10 12:33:18
【问题描述】:

我正在尝试将日期对象转换为 Firestore 时间戳。

var dateOBJ = new Date(); 
var timeStamp = new firebase.firestore.Timestamp(dateOBJ);

这给了我一个错误:

Uncaught Error: Timestamp seconds out of range: Sun Dec 09 2018 11:37:05 GMT+0100

我尝试先使用 .getTime() / 1000 将日期对象转换为秒,但仍然超出范围。

时间戳将是 url 的到期日期,所以我需要添加一些时间。

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    在 Cloud Firestore 中有两种设置日期字段的方法:

    1. 您为该字段指定一个Date 值,在这种情况下,您可以完全确定写入的日期。
    2. 您指定firebase.firestore.FieldValue.serverTimestamp(),在这种情况下,服务器将写入当前日期。

    API 中无法组合这两个选项,您可以使用其中一个。

    由于您评论说要存储时间戳和偏移量,这也是我要存储的内容:

    • 一个timestamp 字段,让服务器使用firebase.firestore.FieldValue.serverTimestamp() 填充。
    • offset 字段,您可以从应用中填充以天/小时为单位的偏移量。

    这样,您可以通过组合这两个字段来重构有效的过期时间戳。


    您甚至可以添加第三个字段来存储过期时间戳,但这需要额外的写入操作。我通常会在 Cloud Functions 中执行此操作,以确保您完全控制该字段并且客户无法欺骗它。如果您不在 Cloud Functions 中执行此操作,请考虑编写安全规则来验证计算字段是否确实是该计算的结果。

    【讨论】:

    • 非常感谢您的回答。您能否指出如何在不使用 date() 函数的情况下检查链接是否过期?如何将这两个字段重构为过期时间戳?
    • 我通常的做法是new Date() - 24 * 60 * 60 * 1000 * offsetInDays。这在一定程度上取决于您如何存储偏移量,但总的来说,adding an offset to a date 在 Stack Overflow 上已经得到了很好的介绍。如果您无法让它为您工作,请打开一个新问题并展示您的尝试。
    【解决方案2】:

    您不会获得与 JavaScript 日期一致的服务器端时间戳。而是从 SDK 发送服务器时间戳:

    const timestamp = firebase.firestore.FieldValue.serverTimestamp()
    

    如果您仍想将时间戳设置为 Date,您只需将 new Date() 传递给 Firestore,它将被保存为时间戳。

    【讨论】:

    • 非常感谢您的回复!问题是我必须添加到那个时间戳。时间戳是 url 的到期日期/时间。所以最后我需要有时间戳+一些小时/天或周的时间并将其存储在 Firestore 中。
    • 好的,我会用一个可能的解决方案编辑我的答案。
    【解决方案3】:

    Frank 对在 Firestore 中设置时间戳是正确的。

    如果您之后想在前端检查该时间戳,您需要在从 firestore 返回的时间戳对象上使用.toDate 以将其转回 JS 日期。

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2021-01-18
      • 2018-12-09
      • 2020-02-23
      • 2019-10-09
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      相关资源
      最近更新 更多