Какой оптимальный способ хранения 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 - времяIntervalSince1970

// 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 имеет "субсекундную точность".

Требования

Какой бы метод я ни выбрал, он должен быть:

  • Точность в течение секунды.

  • Читаемость и надежность.

Мой вопрос

Является ли неточность с Вариантом 2, потому что я делаю что-то неправильно?

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

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

Спасибо!

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Если вы сохраняете дату истечения срока действия API-интерфейса Facebook, я бы использовал * Вариант 2 *.

Вариант второй может быть легко преобразован в строку (с использованием stringWithFormat). Самое главное, он работает для API-интерфейсов Graph.

Кроме того, вам не нужно беспокоиться о формате вашей даты. Не имея отношения к NSDateFormatter, стоит вероятность 48-секундной ошибки.