Domanda

Ho cercato di trovare un modo ragionevole di archiviare i dati giornalieri utilizzando Core Data su iPhone.

La mia app riceve i dati in formato CSV, con una data ma senza ora:

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

Quando questi dati sono memorizzati, dovrebbe esserci solo un record al giorno. Ho pensato che la cosa migliore da fare fosse creare un NSDate da memorizzare, ma eliminare il tempo e l'amplificazione dati del fuso orario.

Posso facilmente creare un NSDate senza ore, minuti o secondi usando NSDateComponents o un NSDateFormatter. Tuttavia, anche quando imposto esplicitamente il fuso orario su UTC o a zero secondi dal GMT, l'output di una data creata con NSLog () sempre ha il mio fuso orario locale come:

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

Qualcuno conosce un modo migliore per creare NSDate senza componenti temporali? O forse un modo migliore per memorizzare le date?

È stato utile?

Soluzione

Una buona regola di programmazione è di memorizzare sempre le date in UTC. Non importa se si utilizzano o meno i dati di base; dovrai ancora fare un po 'di lavoro perché le classi di date di Apple fanno praticamente schifo.

Le date sono rappresentate internamente come numero di secondi dalla data di riferimento che, credo, è il 1 ° gennaio 2001 00:00:00 (sebbene la data di riferimento effettiva non sia molto importante). Il punto è che gli oggetti NSDate sono sempre nativamente in UTC. Se le date che ricevi nel tuo file CSV sono locali, dovrai fare qualcosa del genere per ottenere l'ora UTC:

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

Quindi, impostarei l'ora su 00:00:00. Ora stai salvando la data, a mezzanotte, in UTC. Ai fini della presentazione, per visualizzare tali date verrà utilizzato un NSDateFormatter configurato con il fuso orario desiderato (il fuso orario di sistema è predefinito se non ne si specifica uno)

I fusi orari non contano davvero quando hai a che fare solo con le date. Finché ti assicuri di impostare il fuso orario sul tuo NSDateFormatter su UTC, mostrerai sempre la stessa data, indipendentemente dal fuso orario selezionato dall'utente sul suo dispositivo.

Se non ti piace questa soluzione, puoi sempre memorizzare le tue date in un formato alternativo. Puoi utilizzare un double o int per memorizzare la data in un formato personalizzato (ad es. Il numero di giorni da una data di riferimento), oppure puoi anche spostare la tua classe su modella la data esattamente come desideri e salvala come oggetto NSData . Finché la classe implementa NSCoding , puoi serializzarla su un oggetto NSData in Core Data. Devi solo impostare il tipo di attributo in Dati principali su " Trasformabile " ;.

Hai un sacco di opzioni qui, e nessuna di esse comporta lo sforzo di scrivere le tue query e i tuoi database SQLite.

Altri suggerimenti

Un NSDate non ha un fuso orario. NSLog utilizza il fuso orario locale; dice +0100 perché è lì che sei.

L'oggetto NSDate includerà sempre la data dell'ora - per citare i documenti che rappresenta [s] un singolo punto nel tempo " e lo fa memorizzando un valore temporale dalla sua data di riferimento (l'inizio del 1 ° gennaio 2001 alle GMT, sempre secondo i documenti). Pertanto non è possibile avere un NSDate ignaro dell'ora del giorno.

Invece di provare a memorizzare le date a modo tuo, utilizzerei comunque NSDate nel tuo modello e prenderei in considerazione l'aggiunta di una coppia di metodi alla tua classe di entità, uno dei quali farà ciò che hai descritto sopra, impostando NSDate su 00:00 : 00 in un determinato giorno. L'altro potrebbe restituire solo la data di un NSDate nel formato preferito. Questi utilizzerebbero quindi il getter e il setter generati da Core Data per accedere alla proprietà NSDate.

Usando ancora NSDate stai usando una classe con cui Core Data può lavorare in modo nativo, il che significa che puoi comunque usare facilmente i predicati per filtrare o ordinare i risultati recuperati per data senza doverci pensare troppo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top