在NSUserDefaults中存储NSDate的最佳方法是什么?

时间:2010-01-06 15:11:40

标签: cocoa datetime nsdate nsuserdefaults nstimeinterval

我在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 bugs,我担心这会出错。

选项2

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

要求

无论我选择何种方法,都必须:

  1. 精确到一秒钟。

  2. 可读且可靠。

  3. 我的问题

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

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

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

    谢谢!

4 个答案:

答案 0 :(得分:376)

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

请参阅the documentation以获取证明。

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

答案 1 :(得分:14)

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

对于选项#2,请使用-setDouble:forKey:-doubleForKey代替基于float的版本。这可能是导致精度错误的原因。

答案 2 :(得分:5)

使用NSUserDefaults;日期存储在祖鲁时间,所以没有时区问题需要担心。将它存储在你的时区,在另一个时区拉出来,你会没事的,系统会处理转换(没有担心日期格式化程序)。

答案 3 :(得分:0)

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

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

另外,您不必担心日期格式。不处理NSDateFormatter值得发生48秒的错误。