Каков оптимальный способ хранения NSDate в NSUserDefaults? - PullRequest
172 голосов
/ 06 января 2010

Существует два способа хранения 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

Это кажется компактным и логичным. Тем не менее, у меня есть опасения, что это пойдет не так из-за ошибок Date Formatter

Вариант 2

Это кажется неуклюжим. Я также не уверен в ее точности - в одном из тестов, которые я проводил, когда я возвращал дату, она истекла на 48 секунд, несмотря на то, что в Apple Docs говорится, что NSTimeInterval обладает «точностью до секунды».

Требования

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

  1. Точно с точностью до секунды.

  2. Читабельно и надежно.

Мой вопрос

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

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

Есть еще один вариант, о котором я не знаю?

Спасибо!

Ответы [ 4 ]

377 голосов
/ 06 января 2010

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

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

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

14 голосов
/ 06 января 2010

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

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

5 голосов
/ 06 января 2010

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

0 голосов
/ 05 августа 2012

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

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

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

...