【发布时间】:2015-05-19 12:50:12
【问题描述】:
我有一个包含NSDate 时间戳的领域对象,表示用户记录某些内容的时间。我需要为此添加时区信息,以便我知道用户创建对象时的本地时区(以便进行准确的日期格式和比较)。
Realm db 中会有很多这样的对象(每天使用应用程序时可能会创建几个),但总的来说,我认为你不能说它会是一个过大的数字(忙碌的用户可能每年使用应用程序创建几千个这样的对象)。
似乎最简单的设计是将timeZoneName 存储为字符串(NSTimeZone 由name 标识,例如“America/New_York”)。这将导致每个领域对象重复大约 10-20 个字符的字符串。
这只是几个可能的字符串值的大量重复。我应该费心尝试优化吗?例如,拥有一个单独的 TimeZoneInfo 领域实体,该实体将具有一个用于时区名称的属性,并确保每个时区只有一个这样的实体。
澄清
让我提出一个更客观的问题。什么会在 Realm 数据库中占用最少的空间?
选项1:
具有存储 NSTimeZone 的 name 的 String 属性的实体。此名称值的平均长度为 15 个字符。该实体可能有数千个实例。
选项 2:
EntityA 具有存储 NSTimeZone 的 name 的 String 属性。只会有几个实例(名称是唯一值)。
EntityB 引用 EntityA(它具有 EntityA 类型的属性)。 EntityB 的实例可能有数千个。
基本上,存储数千个字符串还是存储数千个实体引用更有效?
【问题讨论】:
-
从 GMT 偏移的分钟数,我想。如果您只想要正确的时间,那么知道时间记录在哪个国家并不重要。或者以格林威治标准时间记录所有时间。
-
好主意,但我确实希望能够重新创建一个“完整的”
NSTimeZone对象,并具有适当的abbreviation值,以便在屏幕上显示。使用timeZoneForSecondsFromGMT重新创建 NSTimeZone 时,我无法获得所有这些信息。 -
好的,保存缩写就是这样。但是,正如您所说,每个
NSTimeZone对象都有 1+ 个缩写,因此应该从记录时间的设备中获取,而不是从NSTimeZone对象中获取。 -
我多次阅读第一段,但我仍然不明白为什么需要存储时区。您无需知道时区即可进行准确的日期格式设置和日期之间的比较。 NSDate 的工作方式是保存参考日期和时间的秒数。因此,如果一个用户的时间是下午 1:00,然后 5 分钟后另一个用户保存一个日期并且他的本地时间是上午 8:05,这并不重要。系统以它知道它们之间只有 5 分钟差异的方式保存日期。如果你在它们之间进行比较,它会起作用。
-
@pteofil 我需要格式化日期,并根据创建对象时使用的时区按日历日期分组。例如,用户可以在当地时间 2015 年 5 月 19 日 23:30 录制事件。然后一周后,用户向东飞行三个时区并查看该数据。它仍应显示“2015-05-19 23:30”,即使该绝对 NSDate 值将使用当前设备时区格式化为“2015-05-20 02:30”。因此,我需要了解每个对象的原始时区。
标签: ios macos nsdate realm foundation