2013-08-12 11 views
8

Na moim komputerze (ustawienia regionalne w Stanach Zjednoczonych) domyślny "krótki" format daty jest ustawiony na "1/5/13" (miesiąc/dzień/rok).Problem NSDateFormatter z numerami tygodni

W Preferencjach systemowych dodałem do niego numer tygodnia "1/5/13 1".

Mój problem jest ten kod, gdzie próbuję przekonwertować ciąg do daty:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"]; 
NSLog(@"Date: %@", date); 

Na moim komputerze, to drukuje:

Date: 2000-01-01 05:00:00 +0000 

To , która nie jest nawet blisko .

Co powoduje ten problem?

+0

dlaczego klapka dodajesz ten numer? użyj nsdateformatter, aby go uzyskać. btw: powinieneś użyć '-dateFromString:'. Myślę, że powinieneś skonsultować się z dokumentami. http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html – vikingosegundo

+0

@vikingosegundo Zmieniłem kod, aby użyć 'dateFromString:', wynik jest taki sam.Nie chodzi o to, że dodaję ten numer tygodnia :) Chodzi o to, że moi ** użytkownicy ** dodali ten numer tygodnia w swoich Preferencjach systemowych, a moja aplikacja nie zamienia go na prawidłową datę. –

+0

Zrobiłem to samo w preferencjach systemowych, a następnie ustawiłem formatownik o krótkim stylu, a następnie uruchomiłem 'NSString * dateString = [formatter stringFromDate: [NDate date]]; NSDate * parsedDate = [formatter dateFromSTring: dateString]; 'i zobaczył ten sam problem. 'dateString' został sformatowany zgodnie z moimi preferencjami, ale formater nie przetworzył poprawnie tego samego ciągu znaków! Próbowałem innych zmian w stylu i innych stylach oraz 'CFDateFormatter', z tym samym wynikiem! Być może to błąd ramowy? –

Odpowiedz

8

Spóźniłem się na tę dyskusję i widziałem wiele oferowanych rozwiązań, ale wszystko, co widzę źle, to to, że dwa niekompatybilne elementy formatu daty są używane razem. Twoje pierwotne podejście nie powiodło się, ponieważ ciąg, z którego próbujesz uzyskać datę, nie jest zgodny z tym, co zapewnia.

Jeśli masz zamiar ocenić tydzień w roku, musisz użyć skapitalizowanej wersji roku; zapewnia to kalendarz typu "Tydzień roku".

Miejmy ponownie pracować na swój oryginalny kod kawałek to nowy format:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/YY w"]; 
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"]; 
NSLog(@"Date: %@", date); 

Zauważ, że używam tej formy skapitalizowanych za rok. Z 1 na tydzień roku, mam to:

Date: 2013-01-05 08:00:00 +0000 

iz 2 na tydzień roku:

Date: 2013-01-12 08:00:00 +0000 

iz 3:

Date: 2013-01-19 08:00:00 +0000 

ma sens , prawda? Dzień w dacie zwiększa się o siedem dni z każdym przyrostem o jeden tydzień w roku. Oczywiście czas jest dorkowany, ale nigdy nie omawialiśmy niczego, co moglibyśmy ocenić w tym obszarze, prawda?

+1

+1 to jest tak, jak bym to zrobił. Upewnij się, że uwzględniasz różne lokalizacje, ustawiając właściwość 'locale' formatera na locale reprezentowane przez datę w łańcuchu, który analizujesz. Byłoby to całkowicie niemożliwe, gdyby (na przykład) byłem w Tajlandii, gdzie rok 2013 był ponad 500 lat temu. Ogólnie ustawienie locals na 'en_US_POSIX' działa dobrze dla generowanych komputerowo ciągów znaków. –

+0

"Twoje pierwotne podejście nie powiodło się, ponieważ ciąg znaków, od którego próbujesz uzyskać datę, nie jest zgodny z tym, co zapewnia NSDateFormatterShortStyle." Czy możesz wyjaśnić to stwierdzenie bardziej szczegółowo? –

+0

@CarlVeazey the ShortStyle może być dowolną liczbą odmian (ponieważ może być modyfikowany przez użytkownika na OS X) i nigdy nie będzie zawierał numeru tygodnia. –

-1

Trzeba użyć dateFromString metodę NSDateFormatter ...

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"mm/dd/yyyy"]; 
NSDate *myDate = [dateFormatter dateFromString:@"1/5/2013"]; 
NSLog(@"Date: %@", myDate); 

Jeśli chcesz grać z numerem tygodnia następnie użyć NSCalendar i NSDateComponents oparciu o swoje potrzeby ... (patrz ten fragment kodu)

NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:date]; 
NSInteger week = [components week]; 

Mam nadzieję, że to pomoże.

2
NSDateComponents *cmp=[[[NSDateComponents alloc]init]autorelease]; 
[cmp setWeek:1]; 
NSCalendar *cal=[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSDate *dte=[NSDate date]; 
NSDate *weekDate=[cal dateByAddingComponents:cmp toDate:dte options:0]; 
[dateFormatter setDateFormat:@"MM/dd/YY"]; 
NSString *strDate=[dateFormatter stringFromDate:weekDate]; 
NSLog(@"Date: %@", strDate);