seleccionar insertar formulario formato fecha dar cambiar actual aaaa cocoa core-data nsdate

cocoa - insertar - Cómo almacenar fechas sin tiempos en Core Data



insertar fecha en formulario html (3)

He estado tratando de encontrar una forma sensata de almacenar datos diarios usando Core Data en el iPhone.

Mi aplicación recibe datos en formato csv, con una fecha pero sin tiempo:

date, cycles 2009-08-01, 123 2009-08-02, 234 2009-08-03, 345 2009-08-04, 456

Cuando se almacenan estos datos, solo debe haber un registro por día. Pensé que lo mejor que podía hacer era crear un NSDate para almacenar, pero quitar los datos de la zona horaria.

Puedo crear fácilmente un NSDate sin horas, minutos o segundos usando NSDateComponents o NSDateFormatter. Sin embargo, incluso cuando establezco el huso horario explícitamente en UTC o en cero desde GMT, la salida de una fecha creada con NSLog () siempre tiene mi zona horaria local como:

2009-07-29 00:00:00 +0100

¿Alguien sabe de una mejor manera de hacer NSDates sin componentes de tiempo? ¿O tal vez una mejor forma de almacenar las fechas?


El objeto NSDate siempre incorporará fecha de tiempo: para citar los documentos, "representa [s] un único punto en el tiempo" y lo hace almacenando un valor temporal desde su fecha de referencia (el inicio del 1 de enero de 2001 a GMT, nuevamente según los documentos). Por lo tanto, no puede tener un NSDate que no tenga conocimiento de la hora del día.

En lugar de intentar almacenar las fechas a su manera, seguiría utilizando NSDate en su modelo y consideraría agregar un par de métodos a su clase de entidad, uno de los cuales hará lo que describió anteriormente, configurando NSDate a 00:00:00 en un día determinado. El otro podría devolver solo la fecha de un NSDate en su formato preferido. Estos usarían el eliminador y el setter generados por Core Data para acceder a la propiedad NSDate.

Al seguir usando NSDate, está utilizando una clase con la que Core Data puede trabajar de forma nativa, lo que significa que todavía puede usar predicados fácilmente para filtrar, u ordenar los resultados obtenidos por fecha sin tener que pensar demasiado al respecto.


Un NSDate no tiene un huso horario. NSLog usa su zona horaria local; dice +0100 porque ahí es donde estás.


Una buena regla de programación es almacenar siempre las fechas en UTC. No importa si usa Core Data o no; aún tendrás que trabajar porque las clases de Apple son una mierda.

Las fechas se representan internamente como una cantidad de segundos desde una fecha de referencia que, en mi opinión, es el 1 de enero de 2001 a las 00:00:00 (aunque la fecha de referencia real no es muy importante). El punto es que los objetos NSDate siempre se muestran de forma nativa en UTC. Si las fechas que recibe en su archivo CSV son locales, deberá hacer algo como esto para obtener la hora UTC:

NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]];

Entonces, establecería el horario a las 00:00:00. Ahora está guardando la fecha, a la medianoche, en UTC. Para fines de presentación, usará un NSDateFormatter configurado con la zona horaria de su elección (la zona horaria del sistema es la predeterminada si no especifica uno) para mostrar esas fechas.

Sin embargo, las zonas horarias realmente no importan cuando se trata de fechas. Siempre que se asegure de configurar el huso horario en su NSDateFormatter en UTC, siempre mostrará la misma fecha, sin importar la zona horaria que el usuario haya seleccionado en su dispositivo.

Si no le gusta esta solución, siempre puede almacenar sus fechas en un formato alternativo. Puede usar un double o int para almacenar la fecha en algún formato personalizado (por ejemplo, el número de días desde alguna fecha de referencia), o incluso puede hacer rodar su propia clase para modelar la fecha exactamente de la manera que desee y almacenarla como un NSData objeto. Siempre que la clase implemente NSCoding , puede serializarlo en un objeto NSData en Core Data. Solo necesita establecer el tipo de atributo en Datos principales en "Transformable".

Aquí tiene un montón de opciones, y ninguna implica el esfuerzo de escribir sus propias consultas y bases de datos SQLite.