在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?