Istnieją dwa sposoby przechowywania NSDate w NSUserDefaults, z którymi się spotkałem.
Opcja 1 - setObject: forKey:
// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];
// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];
Opcja 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];
Plusy i minusy
opcja 1
Wydaje się, że jest to zwięzłe i logiczne. Jednak martwię się, że to pójdzie nie tak z powodu błędów programu Date Formatter .
Opcja 2
To wydaje się niezdarne. Nie jestem też pewien dokładności tego - w jednym z testów, które przeprowadziłem, kiedy odzyskałem datę wstecz, minęło 48 sekund, mimo że w dokumentach Apple Docs stwierdzono, że NSTimeInterval ma „dokładność podsekundową”.
Wymagania
Niezależnie od wybranej metody, musi to być:
Precyzja w ciągu sekundy.
Czytelne i niezawodne.
Moje pytanie
Czy jest to niedokładność w Opcji 2, ponieważ robię coś źle?
Której z tych dwóch opcji byś użył?
Czy jest inna opcja, której nie jestem świadomy?
Dzięki!
źródło
W przypadku opcji nr 1 nie sądzę, aby w grę wchodził program formatujący daty. Prawdopodobnie pod maską, ale wyobrażam sobie, że nie jest zepsuty. Data jest przechowywana w formacie ISO 8601 .
W przypadku opcji nr 2 użyj
-setDouble:forKey:
i-doubleForKey
zamiastfloat
wersji bazowych. To może być przyczyną twoich błędów precyzji.źródło
Użyj NSUserDefaults; daty są przechowywane w czasie Zulu, więc nie musisz się martwić o strefę czasową. Przechowuj go w swojej strefie czasowej, wyciągnij w innej strefie czasowej, wszystko będzie dobrze, system zajmie się konwersją (nie musisz się martwić o formatowanie daty).
źródło
Jeśli zapisujesz datę wygaśnięcia z Facebook Graph API, użyłbym * Opcji 2 * .
Opcję drugą można łatwo przekonwertować na ciąg (za pomocą stringWithFormat). Co najważniejsze, działa w przypadku interfejsu Graph API.
Nie musisz też martwić się o format daty. Brak obsługi NSDateFormatter jest wart możliwości wystąpienia 48-sekundowego błędu.
źródło