177

我遇到过两种在 NSUserDefaults 中存储 NSDate 的方法。

选项 1 - setObject:forKey:

// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];

// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];

选项 2 - timeIntervalSince1970

// Set
NSDate *myDate = [NSDate date];
NSTimeInterval myDateTimeInterval = [myDate timeIntervalSince1970];
[[NSUserDefaults standardUserDefaults] setFloat:myDateTimeInterval forKey:@"myDateKey"];

// Get
NSTimeInterval myDateTimeInterval = [[NSUserDefaults standardUserDefaults] floatForKey:@"myDateKey"];
NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:myDateTimeInterval];

优点和缺点

选项1

这似乎是紧凑和合乎逻辑的。但是,由于Date Formatter 错误,我担心这会出错。

选项 2

这似乎很笨拙。我也不确定它的准确性——在我做的一项测试中,当我检索到日期时,它已经过了 48 秒,尽管 Apple Docs 说 NSTimeInterval 具有“亚秒级精度”。

要求

无论我选择什么方法,它必须是:

  1. 精确到一秒钟之内。

  2. 可读且可靠。

我的问题

选项 2 不准确是因为我做错了什么吗?

您会使用这两个选项中的哪一个?

还有其他我不知道的选择吗?

谢谢!

4

4 回答 4

385

你不必要地使事情复杂化。为什么要将日期转换为时间间隔(然后将时间间隔转换为不同的原语)?就[sharedDefaults setObject:theDate forKey:@"theDateKey"]这样吧。NSDate 是 PLIST 格式(日期、数字、字符串、数据、字典和数组)支持的“主要类型”之一,因此您可以直接存储它。

请参阅文档以获取证据。

只需直接存储和检索日期并观察它做正确的事(包括时区、精度等)。正如其他人所说,没有涉及格式化程序。

于 2010-01-06T15:24:50.470 回答
14

对于选项 #1,我认为不涉及日期格式化程序。可能在引擎盖下,但我想它没有坏。日期以ISO 8601格式存储。

对于选项#2,使用-setDouble:forKey:and-doubleForKey而不是float基于 - 的版本。这可能是您的精度错误的原因。

于 2010-01-06T15:16:55.653 回答
5

使用 NSUserDefaults;日期以祖鲁时间存储,因此无需担心时区问题。将其存储在您的时区,将其拉出到另一个时区,您会没事的,系统会处理转换(无需担心日期格式化程序)。

于 2010-01-06T15:21:12.930 回答
1

如果您从 Facebook Graph API 保存到期日期,我会使用* Option 2 *

选项二可以很容易地转换为字符串(使用 stringWithFormat)。最重要的是,它适用于 Graph API。

另外,您不必担心日期的格式。不处理 NSDateFormatter 可能会出现 48 秒的错误。

于 2012-08-05T19:27:07.777 回答