standard cocoa datetime nsdate nsuserdefaults nstimeinterval

cocoa - userdefaults standard set swift 4



¿Cuál es la forma óptima de almacenar un NSDate en NSUserDefaults? (4)

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, tengo preocupaciones de que esto vaya mal debido a los errores de Date Formatter .

opcion 2

Esto parece ser torpe. También estoy inseguro de la precisión del mismo, en una prueba que hice, cuando recuperé la fecha, estaba fuera por 48 segundos, a pesar de que Apple Docs decía que NSTimeInterval tiene "precisión de segundo".

Requisitos

Cualquiera que sea el método que elija, debe ser:

  1. Preciso dentro de un segundo.

  2. 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 alguna otra opción de la que no tenga conocimiento?

¡Gracias!


Estás complicando innecesariamente las cosas. ¿Por qué está convirtiendo la fecha a un intervalo de tiempo (luego el intervalo de tiempo a una primitiva diferente)? Simplemente [sharedDefaults setObject:theDate forKey:@"theDateKey"] y listo. NSDate es uno de los "tipos principales" que admite el formato PLIST (fechas, números, cadenas, datos, diccionarios y matrices), por lo que puede almacenarlo directamente.

Ver la documentación para la prueba.

Simplemente almacene y recupere la fecha directamente y obsérvela Hacer lo correcto (incluidos los husos horarios, la precisión, etc.). No hay formateador involucrado, como han dicho otros.


Para la opción n. ° 1, no creo que esté involucrado un formateador de fecha. Posiblemente bajo el capó, pero me imagino que no está roto. La fecha se almacena en formato ISO 8601 .

Para la opción n. ° 2, use -setDouble:forKey: y -doubleForKey lugar de las versiones float . Esa podría ser la causa de tus errores de precisión.


Si está guardando la fecha de caducidad de la API Graph de Facebook, usaría la * Opción 2 * .

La opción dos se puede convertir fácilmente en una cadena (utilizando stringWithFormat). Lo más importante, funciona para Graph API.

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.


Use NSUserDefaults; las fechas se almacenan en tiempo Zulú, por lo que no hay problemas de zona horaria de qué preocuparse. Guárdelo en su zona horaria, sáquelo en otra zona horaria, estará bien, el sistema maneja la conversión (no hay formateo de fecha de qué preocuparse).