为什么firebase中有serverTimestamp?

为什么firebase中有serverTimestamp?,firebase,google-cloud-firestore,google-cloud-functions,Firebase,Google Cloud Firestore,Google Cloud Functions,我在firebase中有服务器时间戳 我创建了两个文档并进行了测试 一个是newdate(),另一个是admin.firestore.FieldValue.serverTimestamp() 这存储了完全相同的值 然而,为什么会有一个serverTimestamp 我不是指客户端(web)上的服务器时间戳 我指的是firebase函数所使用的serverTimestamp 我应该在什么时候使用它?如果您查看的API文档(我链接到nodejs服务器SDK版本,该版本由nodejs Firebase

我在firebase中有服务器时间戳

我创建了两个文档并进行了测试

一个是
newdate()
,另一个是
admin.firestore.FieldValue.serverTimestamp()

这存储了完全相同的值

然而,为什么会有一个
serverTimestamp

我不是指
客户端(web)上的
服务器时间戳

我指的是firebase函数所使用的
serverTimestamp


我应该在什么时候使用它?

如果您查看的API文档(我链接到nodejs服务器SDK版本,该版本由nodejs Firebase管理SDK使用),您将看到它的粒度大于。时间戳将时间记录为纳秒精度,而日期仅使用毫秒精度。这就是Firestore在内部表示其时间戳的方式,并将精度传递给具有这种新数据类型的客户机,这种新数据类型不会丢失任何数据

为什么这很重要?好的,如果随着时间的推移,有很多文档进入一个集合,那么如果时间更细粒度,那么获得真正唯一的时间戳号的机会就会增加。此外,如果Firestore使用的是纳秒精度,那么在执行分页等操作时,可能需要匹配该精度,这需要知道页面最后一项的排序字段的值。如果您没有反馈一个适当的精确值,您的分页可能不准确

FieldValue.serverTimestamp()
尤其重要,因为它使用了一个时钟值,按照谷歌标准,该值在他们自己的服务器上是准确的。这使用了一种非常复杂的方法,特别是处理闰秒。如果一个客户端试图用自己的时间感来增加一个值,谁知道该客户端时钟值是否准确呢。它可能非常不准确,也许开发人员不希望这样。使用
serverTimestamp()

您可以更进一步,使用它可以检查确保web或移动客户端在需要的字段值中提供了
serverTimestamp()
标记值,因此它不能在只需要真正的当前时间戳的情况下伪造时间戳。安全规则语言允许您使用与字段值进行比较,以确保正确处理基于时间的请求


精度上的差异可能还有其他方式产生差异,但底线是客户端SDK需要匹配服务内部使用的内容。

如果您查看API文档(我链接到了nodejs Firebase管理SDK使用的nodejs服务器SDK版本),您将看到,它的粒度大于。时间戳将时间记录为纳秒精度,而日期仅使用毫秒精度。这就是Firestore在内部表示其时间戳的方式,并将精度传递给具有这种新数据类型的客户机,这种新数据类型不会丢失任何数据

为什么这很重要?好的,如果随着时间的推移,有很多文档进入一个集合,那么如果时间更细粒度,那么获得真正唯一的时间戳号的机会就会增加。此外,如果Firestore使用的是纳秒精度,那么在执行分页等操作时,可能需要匹配该精度,这需要知道页面最后一项的排序字段的值。如果您没有反馈一个适当的精确值,您的分页可能不准确

FieldValue.serverTimestamp()
尤其重要,因为它使用了一个时钟值,按照谷歌标准,该值在他们自己的服务器上是准确的。这使用了一种非常复杂的方法,特别是处理闰秒。如果一个客户端试图用自己的时间感来增加一个值,谁知道该客户端时钟值是否准确呢。它可能非常不准确,也许开发人员不希望这样。使用
serverTimestamp()

您可以更进一步,使用它可以检查确保web或移动客户端在需要的字段值中提供了
serverTimestamp()
标记值,因此它不能在只需要真正的当前时间戳的情况下伪造时间戳。安全规则语言允许您使用与字段值进行比较,以确保正确处理基于时间的请求

精度上的差异可能还有其他方式产生差异,但底线是客户端SDK需要匹配服务内部使用的内容