2013-05-23 8 views
8
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timestamp]; 
NSDateFormatter *_dateFormatter = [[NSDateFormatter alloc] init]; 
[_dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]]; 
[_dateFormatter setDateFormat:@"dd-MM-yy HH:mm"]; 
NSString *dateString = [_dateFormatter stringFromDate:date]; 
NSLog(@"Date: %@ formatted: %@", date, dateString); 
[_dateFormatter release]; 

Mi dà data sbagliata formattato:NSDateFormatter con il fuso orario predefinito dà una data diversa rispetto NSDate metodo descrizione

Data: 2013/01/31 18:00:00 +0000 formattato: 31-01-13 19:00 (dal timestamp: 1359655200.000000)

Strumento di conversione online: http://www.onlineconversion.com/unix_time.htm indica che la prima data è corretta: 2013-01-31 18:00:00 +0000.

Perché NSDateFormatter produce data diversa NSLog? [NSDate description] non deve usare defaultTimeZone quando si stampa su console? Ottengo lo stesso errore con [_dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; e [_dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

risposta

17

Questo è un comportamento corretto, perché:

  1. [NSDate description] usa UTC, non il fuso orario locale (è per questo che c'è un +0000 nella descrizione).
  2. Il tuo NSDateFormatter utilizza il fuso orario locale.
  3. Sei in Danimarca, dove il fuso orario locale è Central European Time, che è attualmente UTC più un'ora.

L'unico modo in cui questi corrisponderanno è se si dice a NSDateFormatter di utilizzare UTC. Potrebbe non essere quello che vuoi, però.

+3

[_dateFormatter setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @ "UTC"]]; risolto. – Lukasz

+3

Solo FTI, generalmente è meglio usare 'timeZoneWithName:' ​​invece di 'timeZoneWithAbbreviazione:'. Per UTC non importa, ma nella maggior parte dei casi il nome è la scelta migliore. –

+0

Il motivo per cui alcune abbreviazioni sono le stesse, ad esempio EST è in Australia e negli Stati Uniti. – migs647

-1

È il problema del fuso orario come hai scoperto. Il fuso orario predefinito prende il fuso orario del sistema. Dì, se sei in GMT + 1, dovresti avere 19-00. Il convertitore che hai usato ti dà tempo GMT.

Se volete fuso orario specifico tempo e si conosce il offset da GMT è possibile utilizzare il seguente,

[_dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:2*60*60]];//GMT+2.0 

Spero che questo risolve il problema.

+0

Questo non è giusto. Ero sempre sicuro che fosse il contrario, ma ci ho provato lo stesso e ho finito per peggiorare ancora: 31-00-13 19:01 – Lukasz

+0

BTW: non sono stato io a votarti. – Lukasz

+0

@Lukasz, questo non è un problema. È sbagliato comunque. – Vignesh

Problemi correlati