2012-01-15 18 views
15

Muszę zainicjować obiekt NSDate z NSString w celu-c. Robię to tak:Dlaczego moja strefa czasowa nie jest zapisywana w moim NSDate?

NSString *dateString = [[webSentence child:@"DateTime"].text stringByReplacingOccurrencesOfString:@"T" withString:@" "]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-mm-dd HH:mm:ss"]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Budapest"]]; 

NSDate *date = [[NSDate alloc] init]; 
date = [dateFormatter dateFromString:dateString]; 

Np: gdy próbuję go z wartości ciągu @ „2011-01-02 17:49:54” Dostaję NSDate 2011-01-02 16:49:54 + 0000. Jak widać różnica między dwiema wartościami wynosi jedną godzinę. NSDate ma złą wartość, powinien być dokładnie taki sam, jaki zdefiniowałem w swoim łańcuchu w strefie czasowej ustawionej w dateFormatter. Wydaje się, że używa mojej daty zdefiniował ciąg znaków jako UTC, nawet jeśli ustawię jego strefę czasową na "Europa/Budapeszt". Jak mogę rozwiązać ten problem?

Dzięki!

Odpowiedz

14

dwie rzeczy:

1) masz błąd w formacie data ciąg. Należy użyć MM za miesiąc, nie mm (małe mm dla minut)

2) po utworzeniu Cię obiekt NSDate, trzeba użyć metody NSDateFormatter stringFromDate: wygenerować ciąg datę zlokalizowaną do konkretnej strefy czasowej. Jeśli po prostu wykonasz prostą operację NSLog() na obiekcie NSDate, będzie ona domyślnie pokazywać datę jako GMT (GMT jest godzinę za czasem budapesztańskim)

+0

Dziękuję bardzo! – Tom

+0

Oznacza to, że jeśli mam strefę czasową, nie mogę zapisać daty w obiekcie NSDate z tą strefą czasową? Będę musiał przechowywać strefę czasową gdzie indziej i użytkownika podczas wyświetlania? – Nil

27

NSDate przechowuje daty w stosunku do standardowej daty odniesienia. Od klasy docs:

"Jedyna prymitywna metoda NSDate, timeIntervalSinceReferenceDate, stanowi podstawę dla wszystkich innych metod interfejsu NSDate. Ta metoda zwraca wartość czasu względem bezwzględnej daty odniesienia - pierwszej chwili 1 Styczeń 2001, GMT. "

NSDate nie ma żadnej koncepcji stref czasowych. Tak więc NSDateFormatter zrobił to, co trzeba: skonwertował datę, o której powiedziałeś, że ma przesunięcie GMT (określając strefę czasową) i podał "znormalizowaną" NSDate dla tej daty.

Jeśli chcesz zobaczyć datę reprezentowaną w strefie czasowej Europa/Budapeszt, użyj istniejącego formatyzatora dat (-stringFromDate :) lub odpowiedniej metody opisu NSDate (np. -descriptionWithCalendarFormat: timeZone: locale :).

P.S.- Nie potrzebujesz przydziału/init w ogóle w swoim kodzie, jak zapisano. W nie-ARC byłby to przeciek.

P.P.S.- Format daty jest nieprawidłowy i daje wyniki bezsensowne. Poszedłem do przodu i wyczyściłem twój kod w następujący sposób (testowany pod ARC):

NSString *dateString = @"2011-09-02 17:49:54"; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"Europe/Budapest"]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
[dateFormatter setTimeZone:tz]; 

NSDate *date = [dateFormatter dateFromString:dateString]; 
NSLog(@"%@", [dateFormatter stringFromDate:date]); 
NSLog(@"%@", [date descriptionWithCalendarFormat:nil timeZone:tz locale:nil]); 
+0

So NSdate nie ma pojęcia strefy czasowej. Ale ma on koncepcję GMT? Nie mogę przekonwertować strefy czasowej na godziny GMT i dodać jej do obiektu NSDate? – Nil

Powiązane problemy