Firebase Firestore Swift,时间戳但服务器时间?

Fat*_*tie 0 ios firebase swift google-cloud-firestore

使用 Firestore,我添加了这样的时间戳字段

    var ref: DocumentReference? = nil
    ref = Firestore.firestore()
        .collection("something")
        .addDocument(data: [
            "name": name,
            "words": words,
            "created": Timestamp(date: Date())
        ]) { ...
            let theNewId = ref!.documentID
            ...
    }
Run Code Online (Sandbox Code Playgroud)

这很好,效果很好,但它并不真正正确。应该使用 Firestore 提供的“服务器时间戳”。

请注意,这是在 iOS (Swift) 和 Firestore 上,而不是 Firebase。

获取服务器时间戳的语法是什么?

bso*_*sod 6

您正在寻找的语法是:

"created": FieldValue.serverTimestamp()
Run Code Online (Sandbox Code Playgroud)

这会创建一个本身没有日期值的令牌。该值是在实际写入此写入时由服务器分配的。写时间戳很简单。

阅读它们有点不那么直接。当您阅读包含它们的文档时,您需要配置它们的处理方式。

doc.get("created", serverTimestampBehavior: .none)
doc.get("created", serverTimestampBehavior: .previous)
doc.get("created", serverTimestampBehavior: .estimate)
Run Code Online (Sandbox Code Playgroud)

nonenil如果服务器尚未设置该值,则实际上会给您一个值。例如,如果您正在编写依赖于延迟补偿回报的文档,您将获得nil(在该延迟补偿回报上)。当服务器最终执行写入并设置值时,它将不再是nil

previous 会给你任何以前的值,如果它们存在的话。

estimate会给你一个价值,但这将是对价值可能的估计。例如,如果您正在编写依赖于延迟补偿返回的文档,estimate即使服务器尚未设置其值,也会为您提供该延迟补偿返回的日期值。

正是出于这些原因,处理 Firestore 的时间戳可能会导致您的快照侦听器返回更多(用于更新令牌的返回)。代币世界的 Swift 替代方案是使用没有任何这些复杂性的 Unix 时间戳:

extension Date {
    var unixTimestamp: Int {
        return Int(self.timeIntervalSince1970 * 1_000) // millisecond precision
    }
}

"created": Date().unixTimestamp
Run Code Online (Sandbox Code Playgroud)

这绝对是时间戳如何工作的最佳解释(由实际发布答案的同一道格史蒂文森撰写):https : //medium.com/firebase-developers/the-secrets-of-firestore-fieldvalue-servertimestamp-revealed -29dd7a38a82b