2010-12-11 3 views
12

NSDateFormatter가 문자열을 파싱 할 때 nil을 반환하면서 NSDateFormatter에 문제가 발생했습니다. 로컬에서 실행할 때 완벽하게 작동합니다 (시뮬레이터 또는 on 나의 기기).두 개의 다른 장치에서 NSDateFormatter의 동작이 일관성이 없음

나는이 동작에 차이를 일으킬 수있는 것을 배제하려고합니다. 내 첫 번째 생각은 로케일했지만 동일한 로케일이 항상 사용되도록 명시 적으로 설정하려고 시도했지만 아무런 차이가 없습니다. 여기

코드입니다 :

PARSING DATE 2010-11-28T20:30:49-0000 AS (null) 

을하지만 로컬 I 얻을 : 오류가 발생한 장치에

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

NSDate *theDate = [dateFormatter dateFromString:dateString]; 
NSLog(@"PARSING DATE %@ AS %@", dateString, theDate); 

, 내가 얻을이 나를 미치게됩니다

PARSING DATE 2010-11-28T20:30:49-0000 AS 2010-11-28 20:30:49 +0000 

, AM 나는 다른 것을 놓쳤다?

4.2 로컬 (시뮬레이터) 및 내 장치 (iPhone 4)에서 실행 중입니다. 실패한 장치는 실행중인 3GS 4.2.1입니다.

어떤 아이디어라도 높이 평가할 수 있습니다!

+0

명시 적으로 형식 문자열을 설정했기 때문에 로캘 설정 코드를 제거해 보셨습니까? – Costique

+0

장치에 "24 시간제"설정이 켜져 있습니까? 자세한 정보는 [Apple QA1480] (http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html)을 참조하십시오. – Anna

+0

네, 위와 같이 로케일을 설정하지 않고 시도했습니다. –

답변

18

결국 나는이 문제의 최하층에 있다는 것을 기쁘게 생각하며, 이것을 도와 주려고 트위터에 @bendodson에게 감사를 전합니다. aBitObvious 또한 위의 그의 의견에서 문제에 부딪쳤다. 내가 할 수만 있다면 그를 뽑았을거야.

사용자의 장치와 광산 간에는 한 가지 다른 점이있었습니다. 즉, 장치가 12 시간 시계를 사용하도록 설정되었으며 광산이 아닌 것입니다. 이 단일 한 것은 NSDateFormatter가 위의 예제에서 시간을 분석 할 수없고 nil을 리턴했다는 것을 의미합니다.

이 문제로 인해 가장 큰 문제는 문제를 로컬에서 재현 할 수 없다는 것입니다.

따라서이 문제를 해결하려면 명확해야합니다. 즉 알려진 고정 된 형식의 날짜/시간 문자열을 구문 분석하는 경우 (필자의 경우 일부 API에서 제공되는 경우가 많음) 날짜 형식 지정기에 올바른 로케일을 설정해야하며 이는 종종 en_US_POSIX가되어야합니다.

... 
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

이에 대한 자세한 내용은 Apple QA1480를 참조하십시오.

+1

고마워 - 하루 종일 나를 괴롭혔던 버그가 수정되었습니다! –

+0

루크, 당신은 내 영웅입니다! –

+0

Gazillion upvotes. 감사 (불행히도, 난 단지 1 줄 수 있습니다) –

관련 문제