Hay dos formas de almacenar un NSDate en NSUserDefaults que he encontrado.
Opción 1 - setObject: forKey:
// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];
// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];
Opción 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];
Pros y contras
Opción 1
Esto parece ser compacto y lógico. Sin embargo, me preocupa que esto salga mal debido a los errores del formateador de fechas .
opcion 2
Esto parece ser torpe. Tampoco estoy seguro de la precisión de la misma: en una prueba que hice, cuando recuperé la fecha en que estaba fuera por 48 segundos, a pesar de que los Documentos de Apple decían que NSTimeInterval tiene "precisión de un segundo".
Requisitos
Cualquier método que elija, debe ser:
Preciso hasta dentro de un segundo.
Legible y confiable.
Mi pregunta
¿Es la inexactitud con la opción 2 porque estoy haciendo algo mal?
¿Cuál de estas dos opciones usarías?
¿Hay otra opción que no conozca?
¡Gracias!
fuente
Para la opción # 1, no creo que esté involucrado un formateador de fechas. Posiblemente debajo del capó, pero imagino que no está roto. La fecha se almacena en forma ISO 8601 .
Para la opción # 2, use
-setDouble:forKey:
y en-doubleForKey
lugar de lasfloat
versiones basadas. Esa podría ser la causa de sus errores de precisión.fuente
Use NSUserDefaults; las fechas se almacenan en hora zulú, por lo que no hay problemas de zona horaria de los que preocuparse. Almacénelo en su zona horaria, sáquelo en otra zona horaria, estará bien, el sistema maneja la conversión (no hay que preocuparse por el formateador de fechas).
fuente
Si está guardando la fecha de vencimiento de la API de Facebook Graph, usaría la * Opción 2 * .
La opción dos se puede convertir fácilmente en una cadena (usando stringWithFormat). Lo más importante, funciona para la API Graph.
Además, no tiene que preocuparse por el formato de su fecha. No tratar con NSDateFormatter vale la posibilidad de un error de 48 segundos.
fuente