문제

다음 코드를 사용하는 경우 :

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];   
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"];
NSLog(@"%@", [dateFormatter stringFromDate:myDate]);

성공적으로 a로 변환됩니다 Date 그러나 객체, 나는 다른 방식으로 포맷 할 수없는 것 같다. yyyy-MM-dd'T'HH:mm, 즉 로그인하는 것은 2010-01-28T15:22:23

DateFormat을 말로 변경하면 [dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"]; 날짜 객체는 null ...

따라서 나의 궁극적 인 질문은 예를 들어 SQL 데이터베이스에서 ISO8601 타임 스탬프를 포맷하는 방법입니다. NSDateFormatterMediumStyle "2010 년 1 월 1 일"을 반환하려면?

도움이 되었습니까?

해결책

출력을 처리하려면 다른 형태가 필요합니다. 코드 후에 이것을 넣으십시오.

NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];   
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);

다른 팁

나는 비슷하지만 약간 더 복잡한 문제가 있으며 매우 간단한 솔루션을 찾았습니다!

문제 :들어오는 ISO8601 날짜는 다음과 같습니다. 2006-06-14T11:06:00+02:00 그들은 끝에 시간대 오프셋이 있습니다.

해결책:Peter Hosey를 사용하십시오 iso8601dateformatter 다운로드 할 수 있습니다 여기.

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *theDate = [formatter dateFromString:dateString];
[formatter release], formatter = nil;

그리고

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;

다음은 Apple의 샘플 코드입니다

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate *date = [formatter dateFromString:dateString];

링크:https://developer.apple.com/library/ios/#qa/qa1480/_index.html

iOS 6.0 이후이 형식을 사용할 수 있습니다.

 yyyy-MM-dd'T'HH:mm:ssZZZZZ

NSDATE에 대한 구문 분석 ISO8601 NSStrings의 매우 빠른 C 구현이 있습니다. SAMCATEGORIES. Cocoapods로 설치하거나 파일을 프로젝트에 복사 할 수 있습니다.

사용 방법은 다음과 같습니다.

[NSDate sam_dateFromISO8601String:@"2013-08-24T06:51:21-07:00"]

매우 강력하고 누락 된 시간대 등을 지원합니다. 위의 내 의견 NSDateFormatter는 많은 날짜를 구문 분석 할 때 나에게 매우 느 렸습니다. 이 구현으로 전환하면 엄청난 양이 도움이되었습니다.

이 코드는 6 개의 프로덕션 앱 (hipstamatic 및 로온) 알려진 문제없이 작업했습니다. 이있다 테스트 스위트 회귀를 방지합니다.

요컨대, 이것이 Objective-C에서 ISO8601 문자열을 구문 분석하는 가장 좋은 방법이라고 생각합니다.


짧은 시간을 제외하고, 성능 및 전송에 대해 우려하는 경우 ISO8601 문자열 대신 정수를 보내는 것이 선호됩니다. 단순히 날짜로 변환 할 수 있습니다 [NSDate dateWithTimeIntervalSince1970:yourInteger]. 성능은 당신이 만들 수있는 한 빠르며 와이어 위로 전송할 문자가 적습니다.

나는 지난번에 사과를 확인했다는 점에 주목해야합니다 NSDate 방법은 ISO8601을 지원하지 않았습니다. 나는 여전히 공식적인 지원을하는 것에 대한 애플과 버그를 가지고있다.

+ (id)dateWithNaturalLanguageString:(NSString *)string

제대로 (마지막으로 실행했을 때) 구문 분석하고 NSDate ISO801 문자열의 객체, 문서에 따르면 사용하지 말아야한다고 말하지만 지금까지 시도한 모든 ISO8601 날짜에서 작동했습니다.

@danielbeards 답변이 저를 위해 일했습니다. 그러나 시간대를 포함시켜야합니다. 그렇지 않으면 UTC 날짜를 현재 시간대로 변환합니다.

- (NSDate *) dateFromISO8601DateString:(NSString *) dateString {
    NSDateFormatter * dateFormatter = [NSDateFormatter new];
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate * date = [dateFormatter dateFromString:dateString];
    return date;
}

@Thread Captain이 형식을 시도해보십시오 : "yyyy-mm-dd't'hh : mm : ss.sss"

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top