考虑以下代码:
let timestamp = Timestamp(seconds: 171475088, nanoseconds: 330370000)
let dateValue = timestamp.dateValue()
let newTimeStamp = Timestamp(date: timestamp.dateValue())
let newDateValue = newTimeStamp.dateValue()
print("timestamp: \(timestamp)")
print("dateValue: \(dateValue)")
print("newTimeStamp: \(newTimeStamp)")
print("newDateValue: \(newDateValue)")
打印:
timestamp: <FIRTimestamp: seconds=171475088 nanoseconds=330370000>
dateValue: 1975-06-08 15:58:08 +0000
newTimeStamp: <FIRTimestamp: seconds=171475088 nanoseconds=330369949>
newDateValue: 1975-06-08 15:58:08 +0000
我损失了 51 纳秒。这可能看起来不多,但它会影响我们在查询中比较日期的方式。
具体用例是我每次进行更改时都尝试在文档上存储lastModifiedDate。我可以根据日期创建时间戳,但问题是我想将此日期存储在 UserDefaults 中,以便下次启动应用程序时我可以检索它并仅获取较新的文档。我无法在 UserDefaults 中存储时间戳。当我将 Swift Date 存储在用户默认值中并稍后获取它并将其转回时间戳以进行 isGreaterThan 比较时,它是不同的并且比较失败。那么除了创建时间戳的字符串表示之外,还有其他建议吗?
Firestore 时间戳的粒度可小至纳秒(如您从数据中看到的)。 dateValue() 返回的 Swift Date 没有这么小的粒度。事实上,如果您点击 API 文档的链接,它会显示:
这可能会失去精度。
这正是这里发生的情况 - 由于 Swift Date 不具有与 Firestore 时间戳相同的粒度,因此您失去了精度。
解决此问题的唯一方法是存储时间戳的实际值(秒和纳秒),或将它们组合起来而不损失精度的其他值(例如两个数字都为零的字符串)填充并连接,以便它们在数字上进行比较),然后与将来的其他时间戳与这两个值进行比较。