繁体   English   中英

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

[英]How to get server Timestamp from Firestore in an android device?

这与这个问题有关: 如何从 Firestore 服务器获取时间戳,而无需担心设备时钟与 Firestore 不同步的情况

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

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

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

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

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

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

我找到了解决获取服务器时间戳问题的方法:FireStore to Android Device(JAVA):

`//Inside serverTimeDate var: Timestamp{seconds: 1663598620 nanoseconds :  numbers}`
Timestamp serverTimeDate  = new Timestamp(new Date());
//Epoch & Unix Timestamp sample : 1663598620 = Monday, September 19, 2022 2:43:40 PM
Log.d(TAG, " Epoch & Unix Timestamp "+ currentTimeDate.getSeconds());
// Console Log the Nanoseconds
 Log.d(TAG, " Nanoseconds: "+ currentTimeDate.getNanoseconds());

在检查它是否准确地获得正确的日期和时间时,我也会使用这个转换器。 https://www.epochconverter.com/ & Firestore 参考文档: https://firebase.google.com/docs/reference/js/v8/firebase.firestore.Timestamp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM