2015-01-27 14 views
14

Korzystam z następującego kodu, aby uzyskać format czasu systemu w ios. Działa to dobrze, gdy mój obecny region jest ustawiony na "United State", ale kiedy zmieniam region z "United State" na "United Kingdom", zawsze daje to 12-godzinny mate.Jak uzyskać format czasu systemowego, gdy region jest "Wielka Brytania" w systemie ios?

#pragma mark 
#pragma mark - get system time 
-(BOOL)getSystemTimeFormat 
{ 
    NSString *strDateFormate = @"hh a"; 
    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:strDateFormate options:0 locale:[NSLocale currentLocale]]; 
    if ([dateFormat rangeOfString:@"h"].location != NSNotFound) 
    { 
     [kNSUserDefaults setBool:YES forKey:@"TimeFormat"]; 
     [kNSUserDefaults synchronize]; 
     return YES; 
    } 
    else 
    { 
     [kNSUserDefaults setBool:NO forKey:@"TimeFormat"]; 
     [kNSUserDefaults synchronize]; 
     return NO; 
    } 

} 

Log regionu "United State" ::

2015-01-27 11: 32: 16,090 [350: 60b] 12 Mrówczan :: 0
27.01.2015 11: 32: 16,585 [350: 60b] Połącz
2015-01-27 11: 32: 16.591 [350: 60b] Aktualizacja lokalizacji ...
2015-01-27 11: 32: 16.604 [350: 60b] Aktualizacja lokalizacji ...
2015-01-27 11: 32: 16.622 [350: 60b] Aktualizacja lokalizacji ...

Log "United Kingdom" regionu ::

2015-01-27 11: 33: 35,785 [364: 60b] 12 Mrówczan :: 1
27.01.2015 11: 33: 36.777 [364: 60b] Połącz
2015-01-27 11: 33: 36.780 [364: 60b] Aktualizacja lokalizacji ...
2015-01-27 11: 33: 36.806 [364: 60b] Aktualizacja lokalizacji ...
2015-01-27 11: 33: 36.832 [364: 60b] Aktualizacja lokalizacji ...

+0

Jest wiele pytań w związku z tym.To, do czego to się sprowadza, to [o czym mowa * Zwrócony ciąg może nie zawierać dokładnie tych komponentów podanych w szablonie, ale może - na przykład - mieć ustawione specyficzne ustawienia regionalne *. * (Https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/# // apple_ref/occ/clm/NSDateFormatter/dateFormatFromTemplate: options: locale :). Jeśli chcesz zagwarantować poprawny wynik dla formatyzatora, użyj locale 'en_US_POSIX' – Petesh

+0

@Petesh Użycie' en_US_POSIX' jest sprzeczne z celem użycia metody 'dateFormatFromTemplate'. – rmaddy

+0

Jestem tego świadomy. Problem polega na tym, że korekty specyficzne dla ustawień lokalnych zmieniają format, o jaki prosisz, tj. Kończysz z 12-godzinnym czasem, zamiast pytanym formatem 24-godzinnym. Apple uważa, że ​​odroczenie do użytkownika, a nie programisty, jest drogą do tego. – Petesh

Odpowiedz

8

Po wielu r & d na ten temat końcu znaleźć rozwiązanie tego problemu.

Wykorzystuje specjalny łańcuch szablonu daty o nazwie "j". Według ICU Spec "J" ...

wywołań preferowany format godzinę na lokalizacji (H, H, K lub k), jak określono, czy H, H, K lub K jest stosowany w standardowym formacie czasu dla ustawień narodowych. Podczas implementacji takiego API, "j" musi zostać zastąpione przez h, H, K lub k przed rozpoczęciem dopasowania do danych availableFormats. Zauważ, że użycie 'j' w szkielecie przekazywanym do API jest jedynym sposobem na uzyskanie szkieletu żądania preferowanego rodzaju czasu lokalnego (12-godzinnego lub 24-godzinnego). To ostatnie zdanie jest ważne. Jest to "jedyny sposób, aby uzyskać szkielet żądania preferowanego rodzaju czasu lokalnego". Ponieważ NSDateFormatter i NSCalendar są zbudowane na bibliotece ICU, to samo dotyczy tutaj.

więc mam zmienić wartość wykrojów w moim kodu

#pragma mark 
#pragma mark - get system time 
-(BOOL)getSystemTimeFormat 
{ 
    NSString *strDateFormate = @"j"; 
    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:strDateFormate options:0 locale:[NSLocale currentLocale]]; 
    if ([dateFormat rangeOfString:@"a"].location != NSNotFound) 
    { 
     [kNSUserDefaults setBool:YES forKey:@"TimeFormat"]; 
     [kNSUserDefaults synchronize]; 
     return YES; 
    } 
    else 
    { 
     [kNSUserDefaults setBool:NO forKey:@"TimeFormat"]; 
     [kNSUserDefaults synchronize]; 
     return NO; 
    } 

} 

znalazłem to rozwiązanie od poniższy link How can I determine if iPhone is set for 12 hour or 24 hour time display?.

4

W zasadzie próbujesz wykryć, czy używany jest format 12-godzinny czy 24-godzinny, prawda? Jeśli tak, spróbuj:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setLocale:[NSLocale currentLocale]]; 
[formatter setDateStyle:NSDateFormatterNoStyle]; 
[formatter setTimeStyle:NSDateFormatterShortStyle]; 
NSString *dateString = [formatter stringFromDate:[NSDate date]]; 
NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]]; 
NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]]; 
BOOL is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound); 
[formatter release]; 
NSLog(@"%@\n",(is24h ? @"YES" : @"NO")); 

Źródło: Detect if time format is in 12hr or 24hr format

+0

to nie działa z moim scenariuszem, próbuję go. –

+0

jeśli spróbujesz zmienić format w Wielkiej Brytanii, a następnie zmienisz format od 12 do 24. to nie działa –

Powiązane problemy