我正在尝试使用firebase-server-timestamp
来向用户展示他/她何时将订单发送给我们。
我遇到的问题是,server-timestamp
显示了错误的时间(例如:当前时间为12:30,但时间戳显示为12:15),这是怎么可能的呢?
Android代码
data class MyTimestampPOJO(
val date: Timestamp = Timestamp.now(), // wrong, 15 minutes too early
)
数据库截图(发送时间为12:50而不是12:35)
将数据写入Firestore
suspend fun sendEmail() {
val data = MyTimestampPOJO()
FirebaseFirestore..getInstance().collection("orders_service").add(data).await()
}
读取数据
export const dbOrderServiceOnCreated = functions
.region("europe-west1")
.firestore
.document("orders_service/{id}")
.onCreate((snapshot, context) => {
const data = snapshot.data()
const date = convertTimestampToDate(data.date)
return Promise.resolve()
}
function convertTimestampToDate(stamp: firestore.Timestamp): string {
return new Intl.DateTimeFormat('de-De', { year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric' }).format(stamp.toDate())
}
我正在测试firebase-emulator
中的内容。我的手机时间是正确的(即使它并不重要,因为server-timestamp
独立于手机时间,正如它应该)。
编辑答案
正如@DIVYANSHU SAHU和@MiniDev99指出的那样,我有几个问题。首先,不应该使用
data class MyTimestampPOJO(val date: Timestamp = Timestamp.now())
应当使用
data class MyTimestampPOJO(@ServerTimestamp val date: Timestamp? = null)
这是因为在文档写入数据库时,第二个POJO-Timestamp将被填充:
此外,每个函数都可以有自己的区域(可调用和基于事件)。因此,应始终将函数区域指定为其特定区域(例如,我们自动分配了我的函数区域,但我住在欧洲)。用于标记时间戳字段的注释,以填充服务器时间戳。如果要写入的POJO包含@ServerTimestamp注释字段的null值,则会用服务器生成的时间戳替换该null值。
export const dbOrderServiceOnCreated = functions
.region("europe-west1") // IMPORTANT!!!!
.firestore
...
https://stackoverflow.com/a/66079801/13139719
这个答案讨论了这个问题。 - DIVYANSHU SAHU