Существует два способа сохранить NSDate в NSUserDefaults, с которым я столкнулся.
// 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];
Опция 1
Это, кажется, компактно и логично. Однако у меня есть беспокойство об этом идущем не так, как надо из-за ошибок Средства форматирования Даты.
Опция 2
Это, кажется, неуклюже. Я также не уверен в точности его - в одном тесте, который я сделал, когда я получил дату назад, это отсутствовало на 48 секунд, несмотря на Документы Apple, говоря, что NSTimeInterval имеет "подвторую точность".
Безотносительно метода я выбираю, это должно быть:
Точный к в течение секунды.
Читаемый и надежный.
Погрешность с Опцией 2 то, потому что я делаю что-то не так?
Который из этих двух опций Вы использовали бы?
Есть ли другая опция, о которой я не знаю?
Спасибо!
Вы ненужно все усложняете. Почему вы конвертируете дату во временный интервал (тогда временной интервал в другой примитив)? Просто [sharedDefaults setObject:theDate forKey:@"theDateKey"]
и покончим с этим. NSDate - один из "основных типов", поддерживаемых форматом PLIST (даты, числа, строки, данные, словари и массивы), поэтому его можно просто хранить напрямую.
Смотрите документацию для справки.
Просто храните и извлекайте дату напрямую и смотрите, как она делает правильные вещи (включая часовые пояса, точность и т.д.). Как уже говорили другие, никакого форматирования не требуется.
Для опции #1, я не верю, что используется форматировщик даты. Возможно, под капотом, но я думаю, что он не сломан. Дата хранится в форме ISO 8601.
Для опции #2 используйте -setDouble:forKey:
и -doubleForKey
вместо версий, основанных на float
-основанных на [11276633]. Это может быть причиной ваших ошибок точности.
Использовать NSUserDefaults; даты хранятся в зулусском времени, поэтому нет проблем с часовыми поясами, о которых стоит беспокоиться. Сохраните его в своем часовом поясе, вытащите его в другом часовом поясе, все будет в порядке, система обрабатывает преобразование (не нужно беспокоиться о форматировании даты).