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

Joh*_*her 172 cocoa datetime nsdate nsuserdefaults nstimeinterval

我在NSUserDefaults中存储了两种存储NSDate的方法.

选项1 - setObject:forKey:

// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];

// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];
Run Code Online (Sandbox Code Playgroud)

选项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];
Run Code Online (Sandbox Code Playgroud)

优点和缺点

选项1

这似乎是紧凑和合乎逻辑的.但是,由于Date Formatter错误,我担心这会出错.

选项2

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

要求

无论我选择何种方法,都必须:

  1. 精确到一秒钟之内.

  2. 可读且可靠.

我的问题

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

你会使用这两个选项中的哪一个?

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

谢谢!

Jos*_*zzi 379

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

请参阅文档以获取证明.

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

  • 约书亚,谢谢你的回答.我尝试这种愚蠢错综复杂的浮动方法的原因仅仅是因为我看到另一位伟大的开发者这样做了,我认为他是出于某种原因做到了这一点.显然不是.我应该对自己的本能有更多的信心,那就是使用setObject:forKey:并且完成了它. (8认同)
  • 我对于不必要的并发症的想法是完全暴力的 - 这对于开发者和普遍懒惰的人来说是一个很好的特质.:-) (7认同)
  • @JohnGallagher**[侧边栏]**不要将某人的具体实施误认为是穷人.你原来的观点"认为他是出于某种原因做出来的......显然不是"只有你了解了所述开发人员要求的整个范围才有效.盲目和谨慎的做法是盲目地将他的方法标记为"显然没有理由这样做".话虽这么说,是的,如果你没有理由不这样做,我会同意约书亚保持简单的方法. (3认同)

Joh*_*eek 14

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

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

  • 直接使用日期,而不是时间间隔.我怀疑当这么多应用程序依赖它时,这样一个基本的API会被破坏. (8认同)
  • 对于记录 - 32位浮点数只有24位精度,所以1970年至今为40年,即40*365*86400秒,(40*365*86 400)/(2**24)= 75秒错误.双精度是DateTime间隔,其RAW精度现在优于百万分之一秒. (2认同)

Ben*_*ieb 5

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