如何处理 Swift Date 和 Firestore Timestamp.dateValue() 中的精度差异

问题描述 投票:0回答:1

考虑以下代码:

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 比较时,它是不同的并且比较失败。那么除了创建时间戳的字符串表示之外,还有其他建议吗?

swift firebase google-cloud-firestore
1个回答
0
投票

Firestore 时间戳的粒度可小至纳秒(如您从数据中看到的)。 dateValue() 返回的 Swift Date 没有这么小的粒度。事实上,如果您点击 API 文档的链接,它会显示:

这可能会失去精度。

这正是这里发生的情况 - 由于 Swift Date 不具有与 Firestore 时间戳相同的粒度,因此您失去了精度。

解决此问题的唯一方法是存储时间戳的实际值(纳秒),或将它们组合起来而不损失精度的其他值(例如两个数字都为零的字符串)填充并连接,以便它们在数字上进行比较),然后与将来的其他时间戳与这两个值进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.