【问题标题】:Why is stored date a month different than what's created / logged?为什么一个月的存储日期与创建/记录的日期不同?
【发布时间】:2021-03-28 04:56:47
【问题描述】:

我有这个 Firebase 函数来增加一些统计数据(它已经被削减了一点,但不会影响我的问题):

exports.processRecordEventStat = functions.https.onCall(async (data, context) => {

  const n = new Date();
  const d = new Date(n.getFullYear(), n.getMonth());

  console.log(d);

  //Add to aggregate stats
  let aggStatDoc = await admin.firestore().collection('businesses').doc(businessid).collection('aggregatestats').doc(`${d.getFullYear()}-${d.getMonth() + 1}`).get();
  if (aggStatDoc.exists)
    return aggStatDoc.ref.update({ [stat]: firestore.FieldValue.increment(1), date: d });
  else
    return aggStatDoc.ref.set({ [stat]: 1, date: d });
});

当这个函数运行时,我在控制台中看到这个日志并且日期看起来是正确的(当前日期精确到月份):

但是当从 Firestore 查看或检索时,我的日期变为:

为什么日期存储在文档中后一个月?

【问题讨论】:

  • 您碰巧选择了当月的最后一天。显示一个相对于您当地时区的日期(仍然是 2 月 28 日);另一个关于格林威治标准时间(结束到 3 月 1 日)。因此,“月”差异:) 完全相同的日期/时间 - 只是两种不同的“显示”表示。

标签: node.js firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

每个平台都有自己的显示日期/时间对象的方式。幸运的是,Firebase 控制台和 Functions 记录器就此处的日期值达成一致,但没有什么可以迫使他们就如何显示日期达成一致。

如果您仔细观察,您会发现这两个时间戳实际上是相同的,唯一的区别在于时区和显示格式。 UTC 时间 3 月 1 日午夜实际上是太平洋夏令时间 2 月 28 日下午 6 点。

Cloud Functions 日志似乎使用 ISO8601 和 UTC 时区(我通常更喜欢),但 Firestore 控制台使用默认 JavaScript 格式(这也很常见)并以太平洋时间显示它们(这很常见用于 Google 服务)。

【讨论】:

  • 当我在我的机器上执行new Date(new Date().getFullYear(), new Date().getMonth()).getTime() 时,我得到的结果为1614578400000。但是在我的firebase 函数中记录d.getTime() 会导致1614556800000。自纪元以来的毫秒数不应该相同?
  • @Tristan getTime() 将返回自 UTC 时间 1970-01-01 00:00 以来的毫秒数。但是因为您根据本地时间 (getYear, getMonth) 设置日期,所以您设置了不同的时间戳,要将这样的日期调整为 UTC,您必须从结果中减去您的时区偏移量(以分钟为单位),例如let d = new Date(new Date().getFullYear(), new Date().getMonth()), msUTC = d.getTime() - d.getTimezoneOffset() * 60000;。使用FieldValue.serverTimestamp() 通常更简单。
  • @samthecodingman 谢谢,我会试一试。我在 MDN 上阅读了 .getTime() 的文档,其中指出它始终使用 UTC 计算。我只是假设其他地方也是如此。
  • @Tristan 假设我使用了new Date(2021, 2)。在云函数上,这给出了2021-03-01 00:00 UTC / 1614556800000。在我的系统上,它会给出2021-03-01 00:00 AEST,实际上是2021-02-28 13:00 UTC / 1614517200000
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多