簡體   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