173 votes

Quelle est la meilleure façon de stocker une NSDate dans NSUserDefaults ?

Il y a deux façons de stocker une NSDate dans NSUserDefaults que j'ai rencontrées.

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];

Avantages et inconvénients

Option 1

Cela semble être compact et logique. Cependant, je crains que cela ne tourne mal à cause de Bogues du formateur de date .

Option 2

Cela semble être maladroit. Je ne suis pas non plus certain de la précision de cette méthode : lors d'un de mes tests, lorsque j'ai récupéré la date, elle était décalée de 48 secondes, alors que les documents d'Apple indiquent que NSTimeInterval a une "précision inférieure à la seconde".

Exigences

Quelle que soit la méthode que je choisisse, elle doit l'être :

  1. Précis à la seconde près.

  2. Lisible et fiable.

Ma question

L'imprécision de l'option 2 est-elle due au fait que je fais quelque chose de mal ?

Laquelle de ces deux options utiliseriez-vous ?

Existe-t-il une autre option dont je ne suis pas au courant ?

Gracias.

380voto

Joshua Nozzi Points 38718

Vous compliquez inutilement les choses. Pourquoi convertissez-vous la date en un intervalle de temps (puis l'intervalle de temps en une autre primitive) ? Juste [sharedDefaults setObject:theDate forKey:@"theDateKey"] et d'en finir. NSDate est l'un des "principaux types" pris en charge par le format PLIST (dates, nombres, chaînes de caractères, données, dictionnaires et tableaux), vous pouvez donc le stocker directement.

Voir la documentation pour preuve.

Il suffit de stocker et de récupérer la date directement et de la regarder faire la bonne chose (y compris les fuseaux horaires, la précision, etc.). Il n'y a pas de formateur impliqué, comme d'autres l'ont dit.

14voto

John Calsbeek Points 19381

Pour l'option 1, je ne pense pas qu'un formateur de date soit impliqué. Peut-être sous le capot, mais j'imagine que ce n'est pas cassé. La date est stockée dans ISO 8601 formulaire.

Pour l'option n° 2, utilisez -setDouble:forKey: y -doubleForKey au lieu de la float -Les versions basées sur le logiciel. Cela pourrait être la cause de vos erreurs de précision.

5voto

Ben Gottlieb Points 59900

Utilisez NSUserDefaults ; les dates sont stockées en heure Zulu, il n'y a donc pas de problème de fuseau horaire à prendre en compte. Stockez-les dans votre fuseau horaire, sortez-les dans un autre fuseau horaire, tout ira bien, le système se charge de la conversion (pas de formateur de date dont il faut se soucier).

0voto

Nathaniel Symer Points 417

Si vous enregistrez la date d'expiration à partir de l'API Graphique de Facebook, j'utiliserais * Option 2 * .

La deuxième option peut être facilement convertie en une chaîne de caractères (en utilisant stringWithFormat). Plus important encore, elle fonctionne pour l'API graphique.

De plus, vous n'avez pas à vous soucier du format de votre date. Ne pas s'occuper de NSDateFormatter vaut bien la possibilité d'une erreur de 48 secondes.

-1voto

mahendra Points 27

C'est comme :

[[NSUserDefaults standardUserDefaults] setValue:@"0"  forKey:@"lastUpdate"];
        [[NSUserDefaults standardUserDefaults] synchronize];

for date
     NSDate *now = [NSDate date];
     NSLog(@"now 22%@",now);
     [[NSUserDefaults standardUserDefaults] setObject:now forKey:@"startDate"];
     [[NSUserDefaults standardUserDefaults] synchronize];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X