2010-11-23 5 views
22

을 반환 내 코드입니다 :NSDateFormatter dateFromString 여기 전무

NSString *_date = @"Tue, 23 Nov 2010 16:14:14 +0000"; 
NSDateFormatter *parser = [[NSDateFormatter alloc] init]; 
[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss '+0000'"]; 
[parser setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; 
NSDate *date = [parser dateFromString:_date]; 

이 실행되지 않습니다 : '날짜' '전무'로 설정되어 있습니다. 나는

당신이 어떤 생각을 가지고 있습니까 ...

더 이상 성공으로
[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"]; 

으로 시도? 당신의 문자열을해야하므로 사전 시간대의 지정은 'Z'입니다

+1

장치/시뮬레이터는 어떤 로케일로 설정되어 있습니까? 로케일이 영어로 설정된 경우에만 작동합니다. –

+0

내 로캘 프랑스어입니다 ... 나는 그것에 대해 부끄러운 줄 알았는데 :)이 코드는 초기 날짜를 변경하지 않고 대부분의 현재 로케일과 호환되도록 만드는 방법이 있습니까? – Harkonnen

+1

NSDateFormatter가 파싱에 특정 로케일 (예 : en_US_POSIX)을 사용하도록 지정할 수 있습니다. [Apple QA1480] (http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html)을 참조하십시오. – Anna

답변

53

이 줄을 추가

NSDateFormatter *parser = [[NSDateFormatter alloc] init]; 
[parser setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; 

하고 작동합니다. 기본적으로 NSDateFormatter은 현재 사용자의 환경 설정에 따라 달라질 수있는 시스템의 현재 로캘을 사용합니다. 위의 날짜 문자열 (@"Tue, 23 Nov 2010 16:14:14 +0000")에는 로케일이 영어가 아닌 다른 언어로 설정된 경우 날짜 포맷터가 인식하지 못하는 영어 단어 ("Tue", "Sep")가 들어 있습니다.

또한 비 서구 문화권의 사용자는 서구 세계에서 사용되는 그레고리력과 다른 달력을 사용하는 로캘을 사용할 수 있습니다. 로케일을 명시 적으로 설정하지 않은 경우 날짜 포맷터가 날짜를 구문 분석 할 수 있지만 결과는 NSDate이므로 다른 모든 시점을 나타냅니다.

로캘 식별자 @"en_US_POSIX"은이 용도로 사용됩니다. @ "en_US"로캘이 언젠가 기본 설정을 변경해야하더라도 변경되지 않을 것입니다.

+0

고맙습니다. 괜찮습니다. – Harkonnen

+0

로케일을 설정하면 문제가 해결되는 이유를 설명 할 수 있다면 좋을 것입니다. 즉,'dateFromString'은 로케일이 미국 영어로 설정된 경우에만 작동할까요? – Andrew

+1

@andrewap : 내 대답을 설명과 함께 업데이트했습니다. 내 추천을 '@ "en_US"에서 "@"en_US_POSIX "로 변경했습니다. 이는 미래를 보장하는 솔루션입니다. –

3

에서

감사 :

[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z"]; 
+0

입니다. z는 실제로 가장 간단하고 깨끗한 해결책 인 imho입니다. – Max