NSCalendar dateFromComponents: GMT fuso orario invece di systemTimeZone
-
27-10-2019 - |
Domanda
Questo codice
NSCalendar *calendar =[NSCalendar currentCalendar];
[gregorian setTimeZone:tz];
NSLog(@"%@", [gregorian timeZone]);
NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:[NSDate date]];
[comp setDay:info.day];
[comp setMonth:info.month];
[comp setYear:info.year];
[comp setHour:info.hour];
[comp setMinute:info.minute];
[comp setSecond:info.second];
[comp setTimeZone:tz];
NSLog(@"%@", [comp timeZone]);
NSLog(@"%@", [gregorian dateFromComponents:comp]);
mostra quanto segue in console:
Europe/Moscow (MSKS) offset 14400 (Daylight)
Europe/Moscow (MSKS) offset 14400 (Daylight)
2011-08-31 20:00:00 +0000
Quindi, il fuso orario per il calendario e dei componenti è specificato correttamente, ma [gregorian dateFromComponents:comp]
restituisce il valore NSDate con il fuso orario sbagliato (GMT).
Di cosa ho bisogno per correggere per ottenere il corretto fuso orario?
Soluzione
L'output che state vedendo è perfettamente normale. Se si NSLog un oggetto NSDate
direttamente, si otterrà Qualunque sia il metodo description
rendimenti, che è la rappresentazione GMT della data (ma questo non è scolpito nella pietra).
oggetti NSDate
non sono soggetti a fusi orari. Un NSDate
rappresenta un assoluto istante di tempo misurato da una data di riferimento. Ad esempio, al momento della scrittura, la data corrente è qualcosa di simile 337035053.199801
(secondi dal giorno di riferimento), che può essere rappresentato come 2011-09-06 20:50:53 GMT
o 2011-09-06 22:50:53 CEST
. Entrambi sono diverse rappresentazioni leggibile del stesso data.
In conclusione, che cosa è necessario per ottenere il fuso orario corretto? È necessario utilizzare NSDateFormatter
per ottenere una rappresentazione di stringa del vostro NSDate
in qualsiasi fuso orario ti piace.
Altri suggerimenti
Questa domanda viene spesso e la risposta è quella di utilizzare un NSDateFormatter
per ottenere il risultato desiderato per il formato della data. Attualmente è sempre stampata con il fuso orario GMT. Ecco la discussione per la documentazione di NSDate
:
Discussione
La rappresentazione non è garantito per rimanere costante in diverse versioni del sistema operativo. per formattare una data, si dovrebbe utilizzare una data formattatore oggetto invece (vedi NSDateFormatter e Guida formattazione di dati)