Есть два способа хранения 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
Это кажется компактным и логичным. Тем не менее, у меня есть опасения по поводу этого происходит неправильно из - за Дата Formatter ошибок .
Вариант 2
Это кажется неуклюжим. Я также не уверен в ее точности - в одном из тестов, которые я проводил, когда я возвращал дату, она истекла на 48 секунд, несмотря на то, что в Apple Docs сказали, что NSTimeInterval обладает «точностью до секунды».
Требования
Какой бы метод я ни выбрал, он должен быть:
Точно с точностью до секунды.
Читаемый и надежный.
Мой вопрос
Является ли неточность с вариантом 2, потому что я делаю что-то не так?
Какой из этих двух вариантов вы бы использовали?
Есть ли другой вариант, о котором я не знаю?
Спасибо!
источник
Для варианта № 1 я не верю, что используется форматер даты. Возможно, под капотом, но я думаю, что он не сломан. Дата хранится в форме ISO 8601 .
Для варианта № 2 используйте
-setDouble:forKey:
и-doubleForKey
вместоfloat
версий на основе. Это может быть причиной ваших ошибок точности.источник
Используйте NSUserDefaults; даты хранятся в зулусском времени, поэтому нет проблем с часовыми поясами. Сохраните его в своем часовом поясе, вытащите его в другом часовом поясе, все будет в порядке, система выполняет преобразование (не нужно беспокоиться о форматере даты).
источник
Если вы сохраняете дату истечения срока действия из API Graph Facebook, я бы использовал * Вариант 2 * .
Второй вариант может быть легко преобразован в строку (используя stringWithFormat). Самое главное, это работает для Graph API.
Кроме того, вам не нужно беспокоиться о формате вашей даты. Отказ от NSDateFormatter стоит вероятности ошибки 48 секунд.
источник