Javascript 使用Firebase Cloud Firestore、Ionic Framework和Angular获取服务器时间戳的最佳方法是什么?

Javascript 使用Firebase Cloud Firestore、Ionic Framework和Angular获取服务器时间戳的最佳方法是什么?,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我在一个真正基于时钟的项目中工作。它有一个功能,可以在桌面和移动应用程序(Android/iOS)上使用Ionic Framework let date = +new Date().getTime() 如果某些用户更改移动时间或系统时间,我们的完整应用程序将获得更改结果 所以在某个地方我找到了一些答案,它显示了从web服务器编程语言获得服务器时间 triggerNextTicket(){ Observable.interval(1000).map((x) => {

我在一个真正基于时钟的项目中工作。它有一个功能,可以在桌面和移动应用程序(Android/iOS)上使用Ionic Framework

let date = +new Date().getTime() 
如果某些用户更改移动时间或系统时间,我们的完整应用程序将获得更改结果

所以在某个地方我找到了一些答案,它显示了从web服务器编程语言获得服务器时间

    triggerNextTicket(){
     Observable.interval(1000).map((x) => {
    let date = +new Date().getTime() ;
    if( (this.nextTicket.ticket_live_at.seconds * 1000) < date){
      this.ngOnInit();
    }
    if((this.ticketData.ticket_live_at.seconds * 1000) < date){
      this.ngOnInit();
    }
但我没有使用任何web框架语言

    triggerNextTicket(){
     Observable.interval(1000).map((x) => {
    let date = +new Date().getTime() ;
    if( (this.nextTicket.ticket_live_at.seconds * 1000) < date){
      this.ngOnInit();
    }
    if((this.ticketData.ticket_live_at.seconds * 1000) < date){
      this.ngOnInit();
    }
在任何情况下,如果用户更改系统时间或在任何情况下,mydate变量都将是新的


感谢

以下是告诉Firestore将服务器端时间戳写入文档的简单方法:

var ref = db.collection("54201787").doc("time");
ref.set({ timestamp: firebase.firestore.FieldValue.serverTimestamp() });
以下是您如何将该值读回您的客户:

ref.onSnapshot(function(snapshot) {
  var timestamp = snapshot.data().timestamp;
  console.log(timestamp.toString());
})
在最后一段代码中,
timestamp
变量是一个变量,因此您也可以访问它的所有其他方法和属性


有关此代码的工作示例,请参阅:

在创建/更新文档时,您应该使用
firebase.firestore.FieldValue.serverTimestamp()
,并在安全规则中验证该文档

例子: 在文档中设置serverTime的步骤

      db.collection("fooBar")
      .doc()
      .set({
        createdAt: firebase.firestore.FieldValue.serverTimestamp(),
        createdBy: this.props.user.uid,
        foo: 'bar',
      })
      .then(() => console.log("Success"))
      .catch(console.error);
安全规则

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if request.resource.data.createdBy == request.auth.uid && request.time == request.resource.data.createdAt
    }
  }
}
通过这种方式,我可以验证我的数据库中没有客户机操纵的值


另外,请注意我是如何根据
request.auth.uid

验证用户uid的,您已经尝试了什么?如果您进行搜索,有许多服务提供此功能。或者您可以创建自己的服务来完成此操作。可以从firebase@phuziLike获取服务器时间戳吗@phuzi:这个问题是关于Firebase实时数据库的,而这个问题是关于云Firestore的。虽然这两个数据库都是Firebase的一部分,并且都提供了设置服务器端时间戳的方法,但语法不同。很好,实际上我们必须在当前时钟时间和事件触发时间匹配时触发事件。。。请想象一下,当用户在他们的设备中有错误的时间时,这是什么意思。我不确定。我的回答显示了如何从Firestore获取当前服务器时间。如果您在将其集成到用例中时遇到问题,请显示重现问题的最小代码。我强烈建议您阅读这方面的内容。您现在共享的代码与从Firestore读取服务器时间戳无关,您的标题就是关于这一点的。您发布后是否发现了问题?在Firestore中,没有可靠的方法来计算本地时间和服务器端时间之间的差异。这意味着您要么使用两个服务器端时间戳,要么使用两个客户端时间戳。前者似乎最有可能,例如,在这种情况下,您可以在用户开始等待票证时编写另一个服务器端时间戳。此时,您知道服务器上的“现在”时间以及触发下一个记录单的时间,因此您可以计算差异。您可能还希望查看Firebase较旧的实时数据库,该数据库测量客户端连接时客户端和服务器时间之间的偏移量。看见