Firebase 时间戳返回错误的日期 - Javascript
Posted
技术标签:
【中文标题】Firebase 时间戳返回错误的日期 - Javascript【英文标题】:Firebase Timestamp returns with wrong date - Javascript 【发布时间】:2020-11-02 16:53:36 【问题描述】:我正在尝试从 firestore 获取 Timestamp 值(使用 Firebase 函数),并且我已经使用 Timestamp 的 toDate() 方法和矩库成功地在本地完成了它。
moment(doc.data().EndDate.toDate())
但是,当我将代码部署到 firebase 并测试该函数时,toDate() 以某种方式返回的 Date 比 firebase 上保存的时间戳少 1 小时。我想它正在将我的日期转换为UTC,因为我在UTC + 1,并且时间戳也与UTC + 1一起存储在firestore中,但我不知道如何可靠地获取时间戳日期,就像在firestore中一样,不分时区。
如果有人知道为什么会发生这种情况或知道如何解决它,那就太好了。
【问题讨论】:
当您致电console.log(doc.data().EndDate.toDate())
时,您究竟会得到什么?日期是如何存储的?无论如何,理解这一点的关键是July 13, 14:17 GMT+1
与July 13, 13:17 GMT+0
的时间戳完全相同。所以主要问题是你的firebase是否存储了正确的时间戳。一旦确定,我们就可以专注于在适当的时区显示它。
我收到 2020-07-19T23:00:00.000Z
并且 Firestore 日期是 2020-07-20T00:00:00。日期使用firebase.firestore.Timestamp.fromDate(subEndDate)
存储,其中 subEndDate 是 javascript 日期。
是的,我用它来比较两个日期,由于返回的日期少于一小时,这也意味着在这种情况下它少了一天,并且不再进行比较。我也使用过 toString(),但同样,只有在本地服务时才有效
你能贴出你用来比较的代码吗?需要明确的是,您很可能通过错误地比较日期来制造问题。您所在时区的午夜是 UTC 前一天的 23:00,因此这些日期可能完全相同,只是您的浏览器将其中一个转换为本地时间,字符串比较不适合比较 Date 对象。
是的,我使用了 isSame:if(moment(subEnd).isSame(moment(today))
的时刻,今天是一个新的日期。是的,这是真的,它是同一时间,但是当时区开始起作用时,它不是。感谢您的帮助
【参考方案1】:
Firestore 中的所有时间戳都以 UTC 格式存储。如果您在 Firebase 控制台中看到不同的内容,那只是您的浏览器将其格式化为您的本地时区。
在 JavaScript 中,所有 Date 对象也以 UTC 表示。如果将其格式化为字符串,则可能会再次根据您的本地时区获得不同的表示形式。
如果您编写的代码使用日期或时间戳计算值,您应该使用 UTC 执行所有计算。这几乎是所有计算系统想要处理的日期。当需要格式化日期以显示给最终用户时,您才应该考虑时区,并根据用户的喜好呈现一些内容。
【讨论】:
是的!我将错误的日期保存到 firebase,感谢您让我走上正确的道路!为了将来参考,或者如果有人和我有同样的问题,我使用 Date.UTC() 构造函数来构建一个 UTC 格式的 Date,(如果你有任何问题,请查看文档),所以当它保存在 firestore 中时仍然是UTC。我正在使用 new Date() 构建一个日期,并且它附加了本地时间,它将与您当前的时区一起保存。不确定它是最佳解决方案还是最符合语义的解决方案,但效果很好。以上是关于Firebase 时间戳返回错误的日期 - Javascript的主要内容,如果未能解决你的问题,请参考以下文章
将 Firebase Firestore 时间戳转换为日期(Swift)?