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

Cocoa 什么';在NSUserDefaults中存储NSDate的最佳方式是什么?,cocoa,datetime,nsdate,nsuserdefaults,nstimeinterval,Cocoa,Datetime,Nsdate,Nsuserdefaults,Nstimeinterval,我遇到过两种在NSUserDefaults中存储NSDate的方法 选项1-设置对象:forKey: 选项2-自1970年起的时间间隔 利弊 选项1 这似乎是紧凑和合乎逻辑的。然而,我一直担心这会出问题,因为 选项2 这似乎很笨拙。我也不确定它的准确性——在我做的一次测试中,当我检索到日期时,它已经过期了48秒,尽管苹果的文档说NSTimeInterval具有“亚秒精度” 要求 无论我选择什么方法,都必须: 精确到一秒钟之内 可读性和可靠性 我的问题 选项2的不准确是因为我做错了什么吗 在这两个

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

选项1-设置对象:forKey: 选项2-自1970年起的时间间隔 利弊 选项1

这似乎是紧凑和合乎逻辑的。然而,我一直担心这会出问题,因为

选项2

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

要求 无论我选择什么方法,都必须:

  • 精确到一秒钟之内

  • 可读性和可靠性

  • 我的问题 选项2的不准确是因为我做错了什么吗

    在这两个选项中,您会使用哪一个

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

    谢谢

    对于选项1,我认为不涉及日期格式化程序。可能在引擎盖下,但我想它没有坏。日期存储在表单中


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

    使用NSUserDefaults;日期存储在祖鲁时间,因此不需要担心时区问题。把它存储在你的时区,在另一个时区取出,你会没事的,系统会处理转换(不用担心日期格式化程序)。

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

    看看证据


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

    如果您从Facebook Graph API保存过期日期,我将使用*选项2*

    选项二可以很容易地转换为字符串(使用stringWithFormat)。最重要的是,它适用于Graph API


    另外,你不必担心约会的形式。不处理NSDateFormatter可能会出现48秒的错误。

    哇,John。谢谢你迅速的回答。你个人会使用哪一种?直接使用日期,而不是时间间隔。我怀疑这么多应用程序依赖这样一个基本的API时,它是否会被破坏。太棒了。这是我的直觉,但我见过一位受人尊敬的开发人员使用float方法编写的第三方代码,所以我认为他使用float方法是有理由的。显然不是。再次感谢你的回答!您看到的代码可能是开发人员不记得哪些类型可以直接存储在属性列表中。对于记录-32位浮点值只有24位精度,因此1970年到现在是40年,即40*365*86400秒,以及(40*365*86400)/(2**24)=75秒错误。双精度是一个日期时间间隔,它的原始精度现在超过百万分之一秒。约书亚,谢谢你的回答。我尝试这种愚蠢的卷积浮点方法的原因很简单,因为我看到另一位伟大的开发人员这么做了,我认为他这么做是有原因的。显然不是。我应该对自己的直觉更有信心,那就是使用setObject:forKey:并且已经完成了。我对不必要的复杂化的想法非常强烈——这对于开发人员和一般懒惰的人来说是一个很好的特点。:-)使用这种方法的情况主要是当NSUserDefaults用作通用中间件用户首选项的存储实现时…@Coyote:在这种情况下,它仍然通过NSUserDefaults进行访问或从属性列表文件进行解析,因此相同的访问或解析应产生正确的NSDate对象,可以根据需要进行转换。@JohnGallagher[侧栏]不要把某人的具体实现误认为是糟糕的。你最初的想法“认为他这样做是出于某种好的理由……显然不是”只有在你理解了上述开发人员要求的全部范围后才有效。盲目地将他的方法贴上“显然没有理由这样做”的标签,这是自以为是和心胸狭窄的。话虽如此,我同意约书亚的方法,如果你没有理由不这样做的话,保持它的简单。
    // Set
    NSDate *myDate = [NSDate date];
    [[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];
    
    // Get
    NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];
    
    // 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];