2013-09-06 11 views
9

Mam dziwny problem z tymi liniami kodu:Data formater zwraca nil na czerwiec

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMyyyy"]; 
NSDate * date = [df dateFromString:@"062008"]; 
NSLog(@"Date %@", date); 

wynik jest:

Date (null) 

Ale kiedy zmienić miesiąc tak:

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMyyyy"]; 
NSDate * date = [df dateFromString:@"072008"]; 
NSLog(@"Date %@", date); 

Wynikiem jest:

Date 2008-06-30 23:00:00 +0000 

Tylko w czerwcu (06) konwersja daty z ciągu nie powiedzie się!

Myślę, że to coś związanego ze strefą czasową, dowolnymi pomysłami.

Dzięki

rozwiązany:

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 

Tak jak myślałem, jest to związane z czasowej.

+3

Napisz własną odpowiedź i kliknij odpowiedź - dostaniesz punkty i sprawisz, że będą wyraźniejsze dla innych użytkowników. –

+0

W swojej odpowiedzi możesz wyjaśnić bardziej szczegółowo: w jaki sposób jest on powiązany ze strefą czasową? OK, zmiana strefy czasowej na GMT "naprawiła" to, ale zrobiła to * naprawdę * naprawiła? W czym problem? Jeśli to naprawdę jest poprawka, a nie tylko bandaż, to w jaki sposób rozwiązuje problem? –

+0

Przy okazji: Jaką strefą czasową * jesteś * w? Kiedy uruchamiam ten kod i najwyraźniej, gdy uruchamia go huzain Shabbir (z odpowiedzi), oboje otrzymujemy datę '@" 062008 "'. Ty nie, więc w jakiej strefie czasowej i kalendarzu używasz swojego formatera? Jeśli zostawisz to ustawienie domyślne, do jakiej strefy czasowej i kalendarza jest ustawiony system? –

Odpowiedz

1

rozwiązano: Jak sądziłem, jest to związane ze strefą czasową.

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
1

tak! jesteś absolutnie poprawny. Jestem również w obliczu tego samego problemu Jak moje myśli również, jest to związane z timezone.Not pewien, czy jest to idealne rozwiązanie dla Twojego pytania

NSString *[email protected]"06-2008"; 
NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MM-yyyy"]; 
[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
NSDate * date = [df dateFromString:strDate]; 
NSLog(@"Date %@", date); 
+0

Zmiana formatu, w którym zapisywane są daty, nie zawsze jest opcją, i nie ujawnia niczego, co spowodowało, że NSDateFormatter zwróci 'zero' na tę datę w tym formacie. –

11

Gratulacje, znalazłeś więcej osobliwości strefy czasowej! Masz rację, że zmiana strefy czasowej rozwiąże problem. Chodźmy speleo i zobaczmy, czy potrafimy zrozumieć dlaczego!

Po pierwsze, będziemy próbować znaleźć każdą strefę czasową, w której ta niesamowitość dzieje:

NSArray *tzs = [NSTimeZone knownTimeZoneNames]; 
NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
f.dateFormat = @"MMyyyy"; 
for (NSString *name in tzs) { 
    f.timeZone = [NSTimeZone timeZoneWithName:name]; 
    NSDate *date = [f dateFromString:@"062008"]; 
    if (date == nil) { 
     NSLog(@"%@", name); 
    } 
} 

To będzie pętli wszystkich znanych stref czasowych i starają się analizować „062008” w tej strefie czasowej. Jeśli prowadzimy to okazuje się, że to kłody:

Africa/Casablanca 
Asia/Karachi 

Więc zgaduję, że żyjesz w obu Casablanki lub Karaczi (bo domyślnie Twój NSDateFormatter jest inicjowany z swojej strefy czasowej, która jest dlaczego "Widzę ten problem, prawdopodobnie Casablanca, biorąc pod uwagę, że wydajesz się być 1 godzinę przed GMT).

Zobaczmy, czy możemy dowiedzieć się, co jest dziwne z tych stref czasowych:

$ zdump -v Africa/Casablanca 
... snip ... 
Africa/Casablanca Sun Jun 1 00:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 WEST isdst=1 
... snip ... 

$ zdump -v Asia/Karachi 
... snip ... 
Asia/Karachi Sat May 31 19:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 PKST isdst=1 
... snip ... 

Rzeczywiście, wygląda na to zarówno Casablanca i Karaczi pomijane godzinę północy 1 czerwca w 2008. Tak więc, jesteś w istocie dając mu nierozłączną datę i wraca nil. W skrócie.

W tym przypadku prawidłowa odpowiedź jest zmienić strefę czasową (GMT prawdopodobnie jest doskonałym wyborem), ponieważ są szanse, to ciąg jesteś parsowania nie nadchodzi z wejścia użytkownika (biorąc pod uwagę jego dziwny format), a w związku z tym powinny być analizowane zgodnie ze standardową strefą czasową. I chociaż jestem przekonany, że Casablanca i Karachi są naprawdę fajnymi miejscami, ich strefy czasowe nie są często spotykane ...

TL; DR:

Daylight Saving Time powinny zostać zniesione.