【发布时间】:2020-01-25 11:19:30
【问题描述】:
我了解FieldValue.serverTimestamp() 可用于在执行数据库操作时在 Firestore 服务器中生成时间戳。我想了解如何在不进行任何数据库相关操作的情况下以 Date/Timestamp 格式从特定设备中的 Firestore 数据库获取时间戳。
【问题讨论】:
标签: java android firebase google-cloud-firestore
我了解FieldValue.serverTimestamp() 可用于在执行数据库操作时在 Firestore 服务器中生成时间戳。我想了解如何在不进行任何数据库相关操作的情况下以 Date/Timestamp 格式从特定设备中的 Firestore 数据库获取时间戳。
【问题讨论】:
标签: java android firebase google-cloud-firestore
如果不使用数据库操作,则无法从 Firestore 获取服务器时间戳。
您可以做的是编写一个返回当前时间的Cloud Function(可能是HTTP trigger,或callable type function),然后直接从客户端调用它以获取该时间戳。这样可以避免使用数据库,而且您最终会得到相同的时间,因为所有 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。
【讨论】: