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


174

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

选项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

这似乎很笨拙。我也不确定它的准确性-在一次测试中,尽管苹果文档说NSTimeInterval具有“亚秒级准确性”,但是当我检索到日期时,它已经过了48秒。

要求

无论选择哪种方法,都必须是:

  1. 精确到一秒钟。

  2. 可读且可靠。

我的问题

选项2是否因为我做错了事而不准确?

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

还有我不知道的另一种选择吗?

谢谢!

Answers:


380

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

请参阅文档以获取证明。

只需直接存储和检索日期并观看“做正确的事”(包括时区,精度等)即可。就像其他人所说的,它不涉及格式化程序。


8
约书亚,谢谢您的回答。我之所以选择愚蠢的卷积浮点方法,是因为我看到另一个优秀的开发人员这样做了,而且我认为他之所以这样做是有充分的理由。显然不是。我对自己的直觉应该有更多的信心,那就是使用setObject:forKey:并完成了它。
约翰·加拉格尔

7
我对不必要的复杂性一无所知-对于开发人员和通常懒惰的人来说,这是一个很好的特征。:-)
约书亚·诺齐

使用这种方法的情况通常是在将NSUserDefaults用作通用中间件的用户首选项的存储实现时...
Coyote

@Coyote:在这种情况下,仍可以通过NSUserDefaults访问它或从属性列表文件中对其进行解析,因此相同的访问或解析应产生适当的NSDate对象,可以根据需要对其进行转换。
约书亚·诺齐

3
@JohnGallagher [sidebar]不要将某人的特定实现误认为是一个穷人。您最初的观点“认为他已经出于某些充分的理由而这么做了……显然不是这样”仅在您理解了所述开发人员要求的整个范围时才有效。盲目地将他的方法标记为“显然没有充分的理由这样做”,这是自负和谨慎的。话虽这么说,是的,如果您没有其他理由,我同意约书亚所说的保持简单的方法。
dooleyo 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.