在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

这似乎是紧凑和合乎逻辑的。 但是,由于日期格式化错误,我担心这会出错。

选项2

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

要求

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

  • 精确到一秒钟内。

  • 可读性和可靠性。

  • 我的问题

    选项2的错误是因为我做错了什么?

    你会使用哪两个选项?

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

    谢谢!


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

    请参阅文档以获取证明。

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


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

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


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

    链接地址: http://www.djcxy.com/p/14919.html

    上一篇: What's the optimum way of storing an NSDate in NSUserDefaults?

    下一篇: What is the most efficient way to sort an NSSet?