2013-05-23 4 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]; 

Daje mi złą datę sformatowaną:NSDateFormatter z domyślną strefę czasową daje inny termin niż NSDate metody opisu

Data: 31.01.2013 18:00:00 +0000 sformatowane: 31-01-13 19:00 (z timestamp: 1359655200.000000)

Narzędzie do konwersji online: http://www.onlineconversion.com/unix_time.htm wskazuje, że pierwsza data jest poprawna: 2013-01-31 18:00:00 +0000.

Dlaczego NSDateFormatter wyświetla inną datę niż NSLog? Czy w przypadku drukowania na konsoli nie należy używać wartości domyślnej TimeTone w przypadku [NSDate description]? Ten sam błąd występuje z [_dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; i [_dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

Odpowiedz

17

Jest to poprawne zachowanie, ponieważ:

  1. [NSDate description] używa UTC, a nie lokalnej strefy czasowej (to dlatego istnieje +0000 w opisie).
  2. Twoja NSDateFormatter używa lokalnej strefy czasowej.
  3. Jesteś w Danii, gdzie lokalna strefa czasowa to czas środkowoeuropejski, czyli obecnie UTC plus jedna godzina.

Jedynym sposobem, w jaki będą one pasować, jest podanie NSDateFormatter, aby użyć UTC. Być może nie jest to tym, czego chcesz.

+3

[_dateFormatter setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @ "UTC"]]; rozwiązałem to. – Lukasz

+3

Po prostu FTI, ogólnie lepiej używać 'timeZoneWithName:' ​​zamiast 'timeZoneWithAbbreviation:'. Dla UTC nie ma znaczenia, ale w większości przypadków nazwa jest lepszym wyborem. –

+0

Powód, dla którego niektóre skróty są takie same, np. EST występuje w Australii i USA. – migs647

-1

Jest to problem strefy czasowej, jaki odkryłeś. Domyślna strefa czasowa przyjmuje strefę czasową systemu. Powiedzmy, że jeśli jesteś w GMT + 1, masz dostać 19-00. Używany konwerter zapewnia czas GMT.

Jeśli chcesz konkretną strefę czasową, czas i wiesz przesunięcie od GMT można użyć następujących,

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

nadzieję, że to rozwiązuje problem.

+0

To nie w porządku. Zawsze byłem pewien, że jest inaczej, ale i tak spróbowałem i skończyłem z jeszcze gorszym: 31-00-13 19:01 – Lukasz

+0

BTW: to nie ja cię głosowałem. – Lukasz

+0

@Lukasz, To nie jest problem. I tak jest źle. – Vignesh

Powiązane problemy