Es gibt zwei Möglichkeiten, ein NSDate in NSUserDefaults zu speichern, auf die ich gestoßen bin.
Option 1 - setObject: forKey:
// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];
// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];
Option 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];
Vor-und Nachteile
Option 1
Dies scheint kompakt und logisch zu sein. Ich habe jedoch Bedenken, dass dies aufgrund von Date Formatter-Fehlern schief geht .
Option 2
Das scheint ungeschickt zu sein. Ich bin mir auch nicht sicher, wie genau das ist - in einem Test, den ich durchgeführt habe, war das Datum, als ich es zurückerhielt, um 48 Sekunden abgelaufen, obwohl die Apple Docs sagten, dass NSTimeInterval eine "Genauigkeit von weniger als einer Sekunde" hat.
Bedarf
Welche Methode ich auch wähle, es muss sein:
Präzise auf eine Sekunde.
Lesbar und zuverlässig.
Meine Frage
Ist die Ungenauigkeit mit Option 2, weil ich etwas falsch mache?
Welche dieser beiden Optionen würden Sie verwenden?
Gibt es eine andere Option, die mir nicht bekannt ist?
Vielen Dank!
quelle
Für Option 1 glaube ich nicht, dass ein Datumsformatierer beteiligt ist. Möglicherweise unter der Haube, aber ich stelle mir vor, es ist nicht kaputt. Das Datum wird in ISO 8601- Form gespeichert .
Verwenden Sie für Option 2
-setDouble:forKey:
und-doubleForKey
anstelle derfloat
basierten Versionen. Dies könnte die Ursache für Ihre Präzisionsfehler sein.quelle
Verwenden Sie NSUserDefaults. Daten werden in Zulu-Zeit gespeichert, sodass Sie sich keine Sorgen um Zeitzonen machen müssen. Speichern Sie es in Ihrer Zeitzone, ziehen Sie es in einer anderen Zeitzone heraus, es wird Ihnen gut gehen, das System übernimmt die Konvertierung (kein Datumsformatierer, über den Sie sich Sorgen machen müssen).
quelle
Wenn Sie das Ablaufdatum über die Facebook Graph-API speichern, würde ich * Option 2 * verwenden .
Option zwei kann einfach in eine Zeichenfolge konvertiert werden (mithilfe von stringWithFormat). Am wichtigsten ist, dass es für die Graph-API funktioniert.
Außerdem müssen Sie sich keine Gedanken über das Format Ihres Datums machen. Wenn Sie sich nicht mit NSDateFormatter befassen, kann ein Fehler von 48 Sekunden auftreten.
quelle