【问题标题】:How to get server Timestamp from Firestore in an android device?如何从 Android 设备中的 Firestore 获取服务器时间戳?
【发布时间】:2020-01-25 11:19:30
【问题描述】:

这和这个问题有关:How can I get Timestamp from Firestore server without bothering for the case when device clock is out of sync with Firestore

我了解FieldValue.serverTimestamp() 可用于在执行数据库操作时在 Firestore 服务器中生成时间戳。我想了解如何在不进行任何数据库相关操作的情况下以 Date/Timestamp 格式从特定设备中的 Firestore 数据库获取时间戳。

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    如果不使用数据库操作,则无法从 Firestore 获取服务器时间戳。

    您可以做的是编写一个返回当前时间的Cloud Function(可能是HTTP trigger,或callable type function),然后直接从客户端调用它以获取该时间戳。这样可以避免使用数据库,而且您最终会得到相同的时间,因为所有 Google 服务都有同步时钟。

    请记住,通过网络进行往返会导致客户端接收到的服务器时间视图略有延迟,因为您不知道响应需要多长时间才能通过网络返回。

    【讨论】:

      【解决方案2】:

      所以假设您有一个如下所示的数据库架构:

      Firestore-root
         |
         --- users (collection)
              |
              --- uidOne (document)
                    |
                    --- name: "UserOne"
                    |
                    --- creationDate: January 25, 2020 at 3:37:59 PM UTC+3 //Timestamp
      

      要获取creationDate 属性的值作为Date 对象,请使用以下代码行:

      String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
      FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
      CollectionReference usersRef = rootRef.collection("users");
      usersRef.document(uid).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
          @Override
          public void onComplete(@NonNull Task<DocumentSnapshot> task) {
              DocumentSnapshot document = task.getResult();
              if (document.exists()) {
                  Date creationDate = document.getDate("creationDate");
                  //Do what you need to do with your Date object
              }
          }
      });
      

      请记住,为了获得这个Date 对象,日期应该按照我在以下帖子的回答中的说明进行设置:

      编辑:

      问题强调在不执行任何数据库相关操作的情况下获取服务器时间戳。

      您无法执行此操作,因为该时间戳值完全由 Firebase 服务器生成。换句话说,当发生写入操作时,就会生成该时间戳。您无法在客户端上进行模拟,这是有道理的,因为您自己无法随机生成服务器时间戳。只有 Firebase 服务器可以做到这一点。如果您需要特定的时间戳,您应该以这种方式生成它。由于该属性的类型为Date,因此您可以使用您喜欢的任何日期对其进行设置。因此,与其让 Firestore 决定生成什么时间戳,不如自己设置 Date

      【讨论】:

      • 嗨,我认为这个问题还不够清楚。我了解如何以 Date 格式从数据库中获取 creationDate 。该问题强调在不执行任何数据库相关操作的情况下获取服务器时间戳。 (就像 Timestamp.now() 给了我带有设备偏移量的时间戳一样,我正在寻找类似的东西来获取服务器时间戳)我想使用服务器时间戳在设备上本地执行比较。
      • 我明白,但这是不可能的。检查我更新的答案。
      • 感谢@Alex Mamo 的回答。但是自己设置一个日期对象,不会使其在跨设备的相对时间方面保持一致,因此不会解决我面临的问题。
      • 但我只是希望 Firestore 可以添加一个功能,让我可以通过 Firestore 的简单读取操作获取服务器时间戳
      • 我认为this 可能会对您有所帮助。它适用于 Firebase 实时数据库,但同样的规则适用于 Cloud Firestore。要解决这个问题,只需将偏移量保存到新属性中;)
      猜你喜欢
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2018-10-05
      • 2012-09-14
      • 2014-10-21
      • 2018-11-27
      • 2021-04-19
      相关资源
      最近更新 更多