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

在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格式化错误 ,我担心这会出错。

选项2

这似乎是笨拙的。 我也不确定它的准确性 – 在我做的一个testing中,当我检索到date时,它已经出来了48秒,尽pipe苹果文件说NSTimeInterval具有“亚秒精度”。

要求

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

  1. 精确到一秒之内。

  2. 可读性和可靠性。

我的问题

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

你会使用哪两个选项?

有没有我不知道的另一个选项?

谢谢!

你是不必要的复杂的事情。 你为什么要把date转换成一个时间间隔(然后把时间间隔转换成一个不同的原语)? 只是[sharedDefaults setObject:theDate forKey:@"theDateKey"]并完成它。 NSDate是PLIST格式(date,数字,string,数据,字典和数组)支持的“主要types”之一,所以您可以直接存储它。

请参阅文档以获取certificate。

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

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

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

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

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

选项二可以很容易地转换成一个string(使用stringWithFormat)。 最重要的是,它适用于Graph API。

另外,你不必担心date的格式。 不处理NSDateFormatter值得48秒错误的可能性。