2015-01-27 1 views
14

ios에서 시스템 시간 형식을 가져 오는 데 다음 코드를 사용하고 있습니다. 현재 지역이 "United State"로 설정되어 있지만 "United State"에서 "United Kingdom"으로 지역을 변경하면 항상 12 시간 동안 formate가 제공됩니다. 32 :은 "미국 국무부"영역지역이 "영국"인 경우 시스템 시간 형식을 얻는 방법은 무엇입니까?

#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; 
    } 

} 

로그 ::

2015년 1월 27일 11 16.090 [350 : 60B] 12 : 0 편대
2015년 1월 27일 11 : 32 : 16.585 [350 : 60b] 연결
2015-01-27 11 : 32 : 16.591 [350 : 60b] 교체 업데이트 ...
2015-01-27 11 : 32 : 16.604 [350 : 60b] 로크 업데이트 ...
2015-01-27 11 : 32 : 16.622 [350 : 60b] 로크 업데이트 ...

은 "영국"영역의 :: 1,515,

로그인

2015년 1월 27일 11 : 33 : 35.785 [364 : 60B] 12 : 1 편대
2015년 1월 27일 11 : 33 : 36.777 [364 : 60b] 연결
2015-01-27 11 : 33 : 36.780 [364 : 60b] 회신 업데이트 ...
2015-01-27 11 : 33 : 36.806 [364 : 60b] ...
2015-01-27 11 : 33 : 36.832 [364 : 60b] 회송 업데이트 ...

+0

이와 관련하여 많은 질문이 있습니다.마지막으로 * 표시된 문자열은 템플릿에 제공된 구성 요소를 정확하게 포함 할 수 없지만 예를 들어 로캘 별 조정이 적용될 수 있습니다. *] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/# // apple_ref/occ/clm/NSDateFormatter/dateFormatFromTemplate : options : locale :). 포매터에 올바른 결과를 보장하려면 로케일'en_US_POSIX'을 사용하십시오. – Petesh

+0

@Petesh'en_US_POSIX'를 사용하면'dateFormatFromTemplate' 메소드를 사용하는 목적을 상실합니다. – rmaddy

+0

나는 그 사실을 잘 알고있다. 문제는 사용자가 요청한 형식 즉, 요청 된 24 시간 형식이 아닌 12 시간으로 끝나는 형식을 변경하는 등의 로캘 별 조정이 포함된다는 것입니다. 애플은 프로그래머가 아닌 사용자를 연기하는 것이 이것과 함께 할 수있는 방법이라고 생각한다. – Petesh

답변

8

가 & D이 주제에 대한 연구를 많이 한 후 마지막으로 내가이 문제에 대한 해결책을 찾을 수 있습니다.

"j"라는 특수 날짜 템플릿 문자열을 사용합니다. ICU Spec "J"... H는 H가, K가, 또는 K가 사용되는지 여부에 의해 결정

는 로케일 (H, H, K 또는 K)에 대한 바람직한 시간 포맷을 요청에 따라 로켈의 표준 짧은 시간 형식 이러한 API의 구현에서는 availableFormats 데이터와의 일치를 시작하기 전에 'j'를 h, H, K 또는 k로 대체해야합니다. API에 전달 된 스켈레톤에서 'j'를 사용하면 스켈레톤 요청에 로케일의 기본 시간주기 유형 (12 시간 또는 24 시간)을 요청할 수있는 유일한 방법입니다. 마지막 문장이 중요합니다. 스켈레톤 요청에 로케일의 기본 시간주기 유형을 요청하는 유일한 방법입니다. NSDateFormatter와 NSCalendar는 ICU 라이브러리를 기반으로하므로 여기에서도 마찬가지입니다.

그래서 나는 내가 링크 How can I determine if iPhone is set for 12 hour or 24 hour time display? 다음에서이 솔루션을 발견 내 코드

#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; 
    } 

} 

의 주형 값을 변경할 수 있습니다.

4

기본적으로 12h 또는 24h 형식이 사용되고 있는지 검색하려고합니다. 맞습니까? 그렇다면, 시도 :

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")); 

출처 : Detect if time format is in 12hr or 24hr format

+0

내가 시도하는 시나리오에서 작동하지 않습니다. –

+0

영국에서 형식을 변경하고 형식 12를 24로 변경하려고하면 다음이 작동하지 않습니다. –

관련 문제