小编典典

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

all

我遇到过两种在 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

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

选项 2

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

要求

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

  1. 精确到一秒钟之内。

  2. 可读且可靠。

我的问题

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

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

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

谢谢!


阅读 74

收藏
2022-08-17

共1个答案

小编典典

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

请参阅文档以获取证据。

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

2022-08-17