如何在Core Data中存储没有时间的日期?

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

我们从返回不带时间的日期的服务器下载数据(例如“2024-01-01”)。我们将这些日期解析为 UTC 日期 (

Date
) 并存储在 Core Data 中。

我们遇到了这样的问题:位于 GMT 后时区(例如 EST 或 PST)的用户会看到这些日期显示在错误的日历日中(例如,2024 年 1 月 1 日显示为 2023 年 12 月 31 日)。此外,过滤和其他逻辑未按预期工作。

为了解决这个问题,我们可以更新

DateFormatter
实例以使用 GMT 时区,但是,如果我沿着这条路线走下去,是否意味着我需要在过滤和编辑这些日期的所有地方从本地时间转换为 UTC 时间?这感觉有点笨拙并且容易出错。

我已经看到了一些替代方案,人们使用自己的日期格式(例如,自偏移值以来的天数)。但是,我也想知道是否有一种方法可以保留原始的 ISO8601 字符串并将其存储在 CoreData 中?我认为这将允许根据格式进行搜索和排序。然后,我们可以使用

Date
转换为本地
ISO8601DateFormatter
,以便与日期选择器和格式化程序一起使用。

性能是否会成为一个问题(字符串排序和过滤与数字或从字符串 > 日期的转换)?

我不确定我是否遗漏了一些东西并使生活变得过于复杂......或者我们是否正在处理约会,所以它会很复杂!

core-data
1个回答
0
投票

Core Data 和 Swift 中的日期始终包含一天中的时间,因为它们实际上只是自参考日期和时间以来的秒数。这不是最好的名字,因为“日期”这个词显然并不意味着时间。日期也不包含任何时区信息——它代表各处的同一时刻,而不仅仅是一个时区。

将字符串保留为“2024-01-01”之类的内容即可,并且可搜索和排序。然而,这比进行数字搜索(这就是日期的工作方式)慢得多

如果您希望 2024 年 1 月 1 日在您的 UI 中始终显示为 2024 年 1 月 1 日,无论本地时区如何,有几个选项。

其中之一是确保将日期存储为 UTC(无论如何都应该这样做),然后在 UI 中将它们表示为 UTC 而不是本地时间。只要时区一致,就可以了。在 UI 中使用您喜欢的任何日期格式就可以了。这是最正确的做事方式,但当然真正的代码并不总是需要遵循理想的完美方式。

另一种方法是将字符串和日期都存储在 Core Data 中。仅将日期用于搜索和排序,并将字符串用于 UI。这可能更简单。它不太干净,因为您保存了两个字段,而您只需要一个字段,并且这使得更改 UI 中的日期格式变得更加困难,但它会工作得很好。

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