在核心数据中搜索 NSDate 问题

Posted

技术标签:

【中文标题】在核心数据中搜索 NSDate 问题【英文标题】:Searching Core Data for NSDate issues 【发布时间】:2012-08-11 03:51:51 【问题描述】:

我有一个应用程序从时间戳为 UTC 的服务器中提取数据。我的应用程序必须根据当前本地时间在屏幕上显示内容。我遇到的问题如下

如果我这样做

// the Y M D is fine but time is -8 behind so showing 03:34 instead of 11:34.
NSDate *today = [[NSDate alloc] init]; 

所以当我这样做时

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(start <= %@) AND (room == %@) AND (end >= %@)", today, room, today];

我没有得到正确的结果,因为今天插入 NSPredicate 是“2012-08-10 03:34:00”,但应该是“2012-08-10 11:34:00”

我不能只将时间增加 8 小时,因为该应用程序可能会在不同的时区使用。唯一的想法是让设备时区弄清楚它落后于 UTC 多少小时,然后使用 NSDateComponents 添加/减去这些小时。有没有更简单的方法,只需在 CoreData 中为 NSPredicate fetches 设置一些东西?

【问题讨论】:

【参考方案1】:

[[NSDate alloc] init] 返回当前 UTC 日期和时间。

如果您将日期存储到数据库或服务器,作为最佳实践,您应该存储 UTC 时间,并且只有在 UI 中显示时才转换为“本地”格式。

如果您需要在 UI 中显示它,您应该使用 NSDateFormatter 以在本地时间正确显示它。您可以使用 NSTimeZone 对象来确定本地时区并将您的 NSDateFormatter 设置为适当的时区。

即使您创建了一个由“本地配置”NSDateFormatter 格式化的 NSDate,基础日期/时间仍然是 UTC。

如果您遵循这些原则,您的谓词中的日期就不会有任何问题

【讨论】:

我在存储 UTC 时间并转换我的日期时遇到了麻烦。与 [NSDate date] 争吵产生的结果让我觉得我做错了整件事。您能否指出一些在 UTC 中存储日期(尤其是 [NSDate date]!)然后在本地时区检索和显示它们的方法?

以上是关于在核心数据中搜索 NSDate 问题的主要内容,如果未能解决你的问题,请参考以下文章

核心数据,根据对象自身属性搜索对象

需要编写一个谓词来搜索核心数据对象数组属性中的日期(在我的例子中是日期数组)

搜索 CoreData 以匹配 NSDate - Swift

核心数据和 NSDate

将 NSDate 和 NSNumber 和/或保存在相同的核心数据属性中

将 NSDate 存储在核心数据中(swift)