Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase时间戳返回的日期错误-Javascript_Javascript_Reactjs_Firebase_Google Cloud Firestore_Timestamp - Fatal编程技术网

Firebase时间戳返回的日期错误-Javascript

Firebase时间戳返回的日期错误-Javascript,javascript,reactjs,firebase,google-cloud-firestore,timestamp,Javascript,Reactjs,Firebase,Google Cloud Firestore,Timestamp,我正在尝试从firestore(使用Firebase函数)获取时间戳值,并且我已经使用Timestamp的toDate()方法和矩库在本地成功地实现了这一点 moment(doc.data().EndDate.toDate()) 但当我将代码部署到firebase并测试该函数时,toDate()返回的日期比firebase上保存的时间戳少1小时。我想它正在将我的日期转换为UTC,因为我在UTC+1,时间戳也与UTC+1一起存储在firestore中,但我不知道如何可靠地获取firestore中

我正在尝试从firestore(使用Firebase函数)获取时间戳值,并且我已经使用Timestamp的toDate()方法和矩库在本地成功地实现了这一点

moment(doc.data().EndDate.toDate())
但当我将代码部署到firebase并测试该函数时,toDate()返回的日期比firebase上保存的时间戳少1小时。我想它正在将我的日期转换为UTC,因为我在UTC+1,时间戳也与UTC+1一起存储在firestore中,但我不知道如何可靠地获取firestore中的时间戳日期,无论时区如何


如果有人知道为什么会发生这种情况,或者知道如何解决它,那就太好了。

Firestore中的所有时间戳都存储在UTC中。如果您在Firebase控制台中看到不同的内容,那就是您的浏览器为您的本地时区格式化

在JavaScript中,所有日期对象也用UTC表示。如果将其格式化为字符串,则可能会根据本地时区再次获得不同的表示形式


如果编写的代码使用日期或时间戳计算值,则应使用UTC执行所有计算。这几乎是所有计算机系统都想处理的日期。当需要为最终用户设置显示日期的格式时,您才应该考虑时区,并根据用户的偏好显示一些内容。

当您调用
console.log(doc.data().EndDate.toDate())
时,您到底得到了什么?首先,日期是如何存储的?无论如何,理解这一点的关键是
July 1314:17GMT+1
July 1313:17GMT+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,因此这些日期可能完全相同,只是您的浏览器将其中一个日期转换为本地时间,字符串比较不适合比较日期对象。是的,我使用了moment IsName:
if(moment(subEnd).IsName(moment(today))
今天是一个新的日期。是的,是同一个时间,但当时区开始运行时,就不是了。谢谢你的帮助是的!我将错误的日期保存到firebase,谢谢你为我设置了正确的路径!作为将来的参考,或者如果有人和我有同样的问题,我使用了日期。UTC()构造函数以UTC格式构建日期(如果有任何问题,请检查文档),因此当它保存在firestore中时,它仍然是UTC。我只是用new Date()构建了一个日期,并附加了本地时间,它将与当前时区一起保存。不确定这是最佳解决方案还是最具语义的解决方案,但效果很好。