Каков оптимальный способ сохранить NSDate в NSUserDefaults?

Существует два способа сохранить NSDate в NSUserDefaults, с которым я столкнулся.

Опция 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, говоря, что NSTimeInterval имеет "подвторую точность".

Требования

Безотносительно метода я выбираю, это должно быть:

  1. Точный к в течение секунды.

  2. Читаемый и надежный.

Мой вопрос

Погрешность с Опцией 2 то, потому что я делаю что-то не так?

Который из этих двух опций Вы использовали бы?

Есть ли другая опция, о которой я не знаю?

Спасибо!

172
задан Pål Brattberg 27 April 2011 в 16:42
поделиться

3 ответа

Вы ненужно все усложняете. Почему вы конвертируете дату во временный интервал (тогда временной интервал в другой примитив)? Просто [sharedDefaults setObject:theDate forKey:@"theDateKey"] и покончим с этим. NSDate - один из "основных типов", поддерживаемых форматом PLIST (даты, числа, строки, данные, словари и массивы), поэтому его можно просто хранить напрямую.

Смотрите документацию для справки.

Просто храните и извлекайте дату напрямую и смотрите, как она делает правильные вещи (включая часовые пояса, точность и т.д.). Как уже говорили другие, никакого форматирования не требуется.

379
ответ дан 23 November 2019 в 20:38
поделиться

Для опции #1, я не верю, что используется форматировщик даты. Возможно, под капотом, но я думаю, что он не сломан. Дата хранится в форме ISO 8601.

Для опции #2 используйте -setDouble:forKey: и -doubleForKey вместо версий, основанных на float-основанных на [11276633]. Это может быть причиной ваших ошибок точности.

.
14
ответ дан 23 November 2019 в 20:38
поделиться

Использовать NSUserDefaults; даты хранятся в зулусском времени, поэтому нет проблем с часовыми поясами, о которых стоит беспокоиться. Сохраните его в своем часовом поясе, вытащите его в другом часовом поясе, все будет в порядке, система обрабатывает преобразование (не нужно беспокоиться о форматировании даты).

5
ответ дан 23 November 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: