代码之家  ›  专栏  ›  技术社区  ›  John Gallagher

在nsuserdefaults中存储nsdate的最佳方法是什么?

  •  170
  • John Gallagher  · 技术社区  · 15 年前

    有两种方法可以将nsdate存储在nsuserdefaults中,这是我遇到的。

    选项1-设置对象:分叉:

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

    选项2-从1970年开始的时间间隔

    // 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 bugs .

    选项2

    这似乎很笨拙。我也不确定它的准确性-在我做的一次测试中,当我取回数据时,它在48秒后就失效了,尽管苹果的文档说nsTimeInterval具有“亚秒级的准确性”。

    要求

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

    1. 精确到一秒钟之内。

    2. 可读性和可靠性。

    我的问题

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

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

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

    谢谢!

    4 回复  |  直到 12 年前
        1
  •  374
  •   Joshua Nozzi    15 年前

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

    the documentation 为了证明。

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

        2
  •  14
  •   John Calsbeek    15 年前

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

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

        3
  •  5
  •   Ben Gottlieb    15 年前

    使用nsuserdefaults;日期存储在祖鲁时间中,因此不需要担心时区问题。将它存储在您的时区,在另一个时区拉出,您就可以了,系统处理转换(无需担心日期格式化程序)。

        4
  •  0
  •   Nate Symer    12 年前

    如果您要从Facebook图形API保存到期日期,我将使用 * 选项2 * .

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

    另外,你不必担心日期的格式。不处理nsdateformater值得出现48秒错误的可能性。