2010-02-28 15 views
6

Przeczytałem przewodnik DateFormatting i nadal nie jestem w stanie uzyskać działającego formatera.NSDate z NSString

NSString *string = @"0901Z 12/17/09"; 
//This is a sample date. The Z stands for GMT timezone 
//The 0901 is 09h 01m on a 24 hour clock not 12. 
//As long as I can get the hours/min & date from the string I can deal with the time zone later 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"hhmm'Z' MM/dd/yy"]; 
NSDate *date = [dateFormat dateFromString:string]; 

Odpowiedz

7

To działa dla mnie, gdy próbuję. Dodawanie NSLog(@"%@", date) na końcu kodu daje mi ten komunikat:

2010-02-28 12:17:22.921 app[9204:a0f] 2009-12-17 09:01:00 -0800 

czym polega problem widzisz?

Edytuj: Rozgryzłem to, nie masz problemu z 09:01, ale z innymi 24-godzinnymi czasami, takimi jak 14:25, prawda? Zmienić formatowania do:

@"HHmm'Z' MM/dd/yy" 
+0

Było to 24 godzin rzeczą coraz mnie widocznie. Dzięki. – jamone

1

skopiowany z podobnym pytaniem ja tu odpowiedzi: NSDateFormatter returns nil for @"dd-MM-yy" in iOS 3.0

Jeśli pracujesz z datami użytkownika widoczne, należy unikać ustawiania ciąg formatu daty. Formatowanie dat w ten sposób nie jest możliwe do zlokalizowania i uniemożliwia przewidywanie, w jaki sposób ciąg znaków będzie wyrażany we wszystkich możliwych konfiguracjach użytkownika. Zamiast tego powinieneś ograniczyć się do ustawiania stylów daty i czasu (via - [NSDateFormatter setDateStyle:] i - [NSDateFormatter setTimeStyle:]).

Z drugiej strony, jeśli pracujesz z ustalonymi datami, powinieneś najpierw ustawić ustawienia regionalne formatera daty na coś odpowiedniego dla Twojego stałego formatu. W większości przypadków najlepszym wybranym językiem jest "en_US_POSIX", ustawienie regionalne, które zostało zaprojektowane tak, aby zapewniało wyniki w języku angielskim w USA bez względu na preferencje użytkownika i systemu. "en_US_POSIX" jest również niezmiennikiem w czasie (jeśli USA, w pewnym momencie w przyszłości, zmieni sposób formatowania dat, "en_US" zmieni się, aby odzwierciedlić nowe zachowanie, ale "en_US_POSIX" nie będzie) oraz między komputerami ("en_US_POSIX" działa tak samo w systemie iPhone OS, jak w systemie Mac OS X, i tak samo jak na innych platformach).

Po ustawieniu "en_US_POSIX" jako lokalizacji ustawnika formatowania daty można ustawić ciąg formatu daty, a formatownik będzie zachowywał się konsekwentnie dla wszystkich użytkowników.

Powyższy informacji i więcej można znaleźć w Apple Technical Q&A QA1480

Oto fragment kodu z mojej aplikacji, która realizuje powyższą rekomendację:

static NSDateFormatter* dateFormatter = nil; 
if (!dateFormatter) { 
dateFormatter = [[NSDateFormatter alloc] init]; 
NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] 
      initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 
NSAssert(enUSPOSIXLocale != nil, @"POSIX may not be nil."); 
[dateFormatter setLocale:enUSPOSIXLocale]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000"; 
}