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?

È stato utile?

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)

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