Firestore 没有准确存储时间戳
Firestore does not store the timestamp accurately
当我将一个带有日期的文档写入 Firestore 并对此文档发出即时请求时,我得到的响应略有不同。
let testDate = Date(timeIntervalSinceNow: 0.23894623798574298572)
print("BEFORE:")
print(Timestamp(date: testDate))
ffs.collection("cities").document("LA").setData([
"date": Date(timeIntervalSinceNow: 0.23894623798574298572)
]) { err in
self.ffs.collection("cities").document("LA").getDocument(){ (document,err) in
if let document = document {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("AFTER:")
print(dataDescription)
} else {
print("Document does not exist in cache")
}
}
}
控制台输出:
BEFORE:
<FIRTimestamp: seconds=1626522770 nanoseconds=767140150>
AFTER:
["date": <FIRTimestamp: seconds=1626522770 nanoseconds=770540000>]
为什么纳秒不同?我本来希望它们相等或至少以某种方式四舍五入。
这是因为 Firestore 将日期和时间存储为 Firestore 原生 Timestamp
对象,而不是 Swift 原生 Date
对象。 Timestamp
对象,当我们在客户端与它交互时,是一个令牌。这意味着当我们创建一个 Timestamp
对象时,我们不能给它一个具体的值(一个特定的日期和时间),我们只是创建一个代表现在的标记。当服务器最终执行写入时,它将赎回该令牌(通过给它一个值)并将该值存储在数据库中。这解释了现在在客户端和服务器上的差异。
当我将一个带有日期的文档写入 Firestore 并对此文档发出即时请求时,我得到的响应略有不同。
let testDate = Date(timeIntervalSinceNow: 0.23894623798574298572)
print("BEFORE:")
print(Timestamp(date: testDate))
ffs.collection("cities").document("LA").setData([
"date": Date(timeIntervalSinceNow: 0.23894623798574298572)
]) { err in
self.ffs.collection("cities").document("LA").getDocument(){ (document,err) in
if let document = document {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("AFTER:")
print(dataDescription)
} else {
print("Document does not exist in cache")
}
}
}
控制台输出:
BEFORE:
<FIRTimestamp: seconds=1626522770 nanoseconds=767140150>
AFTER:
["date": <FIRTimestamp: seconds=1626522770 nanoseconds=770540000>]
为什么纳秒不同?我本来希望它们相等或至少以某种方式四舍五入。
这是因为 Firestore 将日期和时间存储为 Firestore 原生 Timestamp
对象,而不是 Swift 原生 Date
对象。 Timestamp
对象,当我们在客户端与它交互时,是一个令牌。这意味着当我们创建一个 Timestamp
对象时,我们不能给它一个具体的值(一个特定的日期和时间),我们只是创建一个代表现在的标记。当服务器最终执行写入时,它将赎回该令牌(通过给它一个值)并将该值存储在数据库中。这解释了现在在客户端和服务器上的差异。