如何从Android设备中的Firestore获取服务器时间戳?

时间:2020-01-25 11:19:30

标签: java android firebase google-cloud-firestore

这与以下问题有关: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数据库中获取时间戳,而无需任何与数据库相关的操作。

2 个答案:

答案 0 :(得分:4)

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

您可以做的是写一个返回当前时间的Cloud Function(可能是HTTP triggercallable type function),然后直接从客户端调用该时间以获得时间戳。这避免了使用数据库的麻烦,并且由于所有Google服务的时钟都已同步,因此您将在同一时间结束。

请记住,由于您不知道响应将需要多长时间才能通过网络返回,因此通过网络往返会导致客户端收到稍微延迟的服务器时间视图。

答案 1 :(得分:1)

因此,假设您拥有一个如下所示的数据库架构:

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