在 NSUserDefault 中存储 NSDate 的最佳方式是什么?

我遇到过两种在 NSUserDefault 中存储 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];

利与弊

选择一

这似乎是紧凑和合乎逻辑的。然而,我担心这会出错,因为 日期格式化程序错误

选择二

这看起来很笨拙。我也不确定它的准确性——在我做的一个测试中,当我把日期恢复回来的时候,它出来了48秒,尽管苹果文档说 NSTimeInterval 具有“亚秒级的准确性”。

规定

不管我选择什么方法,都必须是:

  1. 精确到一秒之内。

  2. 可读性和可靠性。

我的问题

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

在这两个选项中,你会选择哪一个?

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

谢谢!

49679 次浏览

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

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

使用 NSUserDefault; 日期以祖鲁时间存储,因此不必担心时区问题。存储在您的时区,拉出在另一个时区,你会很好,系统处理的转换(没有日期格式化程序需要担心)。

你把事情搞得太复杂了。为什么要将日期转换为时间间隔(然后将时间间隔转换为另一个基元) ?只要 [sharedDefaults setObject:theDate forKey:@"theDateKey"]就行了。NSDate 是 PLIST 格式(日期、数字、字符串、数据、字典和数组)支持的“主要类型”之一,因此您可以直接存储它。

文件的证明。

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

如果您从 Facebook Graph API 中保存过期日期,我将使用 * < em > 方案2 *

选项2可以很容易地转换为字符串(使用 stringWithFormat)。

另外,你不用担心约会的形式。不处理 NSDateFormatter 值得冒出48秒错误的可能性。