CoreData 中的 NSDate 是不是封装了时区?

Posted

技术标签:

【中文标题】CoreData 中的 NSDate 是不是封装了时区?【英文标题】:Do NSDate's in CoreData encapsulate time zone?CoreData 中的 NSDate 是否封装了时区? 【发布时间】:2011-01-18 08:06:51 【问题描述】:

我在我的 CoreData 存储中保存日期和时间,并且需要准确地向用户显示最初输入的时间。问题是,如果他们在东海岸输入 4:00,然后再查看西海岸的记录时间,它会显示为 1:00,因为 iPhone 会将世界时间转换为当地时间。我需要它显示 4:00 -- 可能是 4:00 (+3h00)。

在我去重构我的核心数据模型之前,我想确定没有办法从存储的 NSDate 对象中派生在创建时处于活动状态的 NSTimeZone。有没有?如果没有,任何建议如何最好地自己在创建时捕获 NSTimeZone?一个 NSNumber 表示创建时间 NSTimeZone 与 GMT 的时间差?

谢谢。

【问题讨论】:

好问题!这是一个经典的困惑。简短的回答是“不”。 【参考方案1】:

如您所见,NSDate 代表一个通用时间点,不包括特定时区信息。

我建议不要存储偏移量,而是存储 NSTimeZone 的 name 属性。然后您可以使用+[NSTimeZone timeZoneWithName:] 获取时区,然后将其转换为当地时间。这为您向用户显示信息的方式提供了最大的灵活性。

【讨论】:

+1 因为不想和NSDate 混在一起!单独存储时区信息绝对是要走的路。 在大多数情况下,您还可以将日期存储为 GMT,并在需要显示信息时转换为用户本地时区。 谢谢!这似乎是一个好方法,除了我不认为 name 属性捕获夏令时偏移。可能是一个真正的极端情况,但是我不可能使用欧洲时区的名称作为转换为美国时区的基础,并且由于时区偏移在那一周或两周内异常而导致转换错误未同步的夏令时?毕竟,也许最好在进入时捕获与 GMT 的偏移量?我想我也可以只存储用户信息的时区名称或缩写。 @ed94133 它应该自动处理所有这些东西。

以上是关于CoreData 中的 NSDate 是不是封装了时区?的主要内容,如果未能解决你的问题,请参考以下文章

从 NSDate() 保存一个日期,在 CoreData 的末尾没有 +0000

为啥 NSDate() 在 CoreData 中存储一个奇怪的值

替换 CoreData 中的属性

搜索 CoreData 以匹配 NSDate - Swift

CoreData 按 NSDate 排序不起作用?

检索未包含在 CoreData 请求结果中的第二天