2010-08-14 5 views
2

형식을 모르는 경우 어떻게 iPhone SDK를 사용하여 날짜 및/또는 시간을 나타내는 문자열을 파싱 할 수 있습니까? 가능한 날짜와 시간 범위를 사용할 수있는 응용 프로그램을 만들고 있는데, 형식이 "01-01-2001"대신 "01/01/2001"이었기 때문에 실패하지 않기를 바랍니다. 시간은 포함될 수도 있고 포함되지 않을 수도 있습니다.어떻게 아이폰에서 알 수없는 형식의 날짜 문자열을 구문 분석합니까?

이렇게 할 방법이 있습니까? NSDateFormatter를 "NoStyle"및 setLenient = YES로 설정된 날짜 및 시간 스타일을 사용하여 시도했지만 문자열 중 가장 단순한 구문 분석에 여전히 실패합니다. "01/22/2009 12:00:00 PM"

사전에 형식을 알 수있는 방법이 없기 때문에 경험적으로 형식을 결정하는 방법이 필요합니다.

나는 새로운 DateTime (string_in_any_format)과 같은 간단한 .NET 배경에서 왔습니다. 하지만 Obj-C에서이 작업을 수행하는 방법을 알지 못합니다.

답변

4

iPhone에있는 NSDateFormatter이 아니며 스마트하지 않습니다. 당신은 약간의 지침을 줄 필요가 있습니다. 날짜 및 시간 스타일을 모두 NoStyle으로 설정하면 날짜 또는 시간이 표시되지 않습니다. 적어도 하나는 다른 스타일로 설정해야합니다. 당신은 다음과 같은 것을 할 수 있고 그것은 잘 작동 할 것입니다 (그것이 나를 위해).

NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateStyle:NSDateFormatterLongStyle]; 
[formatter setTimeStyle:NSDateFormatterNoStyle]; 
[formatter setLenient:YES]; 

NSDate * date = [formatter dateFromString:@"01-01/2001"]; 

NSLog(@"%@", date); 
+0

도움 주셔서 감사합니다. 나는 이것이 도움이되는 것을 볼 수 있었지만 그것이 제공되지 않는 것 같기 때문에 나는 단지 내 것을 만들 것이다. 당분간은 제한된 형식 만 지원할 것입니다. –

0

잠재적 인 파서가 01/02/10이 2010 년 1 월 2 일인지를 어떻게 판별합니까? 2010 년 2 월 1 일; 또는 완전히 다른 무엇인가? Bboth mm/dd/yy 및 dd/mm/yy는 고객의 위치에 따라 예상 할 수 있습니다.

+0

파서는 하나의 형식을 취할 수도 있고 다른 하나는 로케일을 기반으로 할 수도 있습니다. 따라서 하나의 가정을 할 수 있습니다. 그러나 이것이 유일한 허용 가정입니다. –

+0

그래서 기본적으로 당신이 요구하는 것은 파서가 -와 /와 어떤 차이도 없도록 만드는 것입니다. – erikkallen

2

이전 게시물이지만 다른 게시물에서 발견 한 더 나은 방법이 있습니다.

는이 같은 방법을 사용할 수 있습니다 :

  • 먼저 시도하고 기대 형식의 몇 날짜를 구문 분석합니다.
  • 그래도 작동하지 않으면 NSDataDetector을 사용하여 날짜 정보를 찾으십시오 (참조 : this SO post). 여기이 사용되는 코드의 샘플입니다

(나는 몇 날짜 형식을 예상하지만 그건 내가 볼 줄 수있는 유일한 일이다 가능하면 실패하고 싶지 않았다 확신 할 수 없었다) :

// your date formats may vary, the OP might try "MM/dd/yyyy" and "MM-dd-yyyy", along with combos that include time info 
NSArray *dateFormatsToTry = @[@"yyyy-MM-dd'T'HH:mmZZZZ", @"yyyy-MM-dd'T'HH:mm:ssZZZ"]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 

for (NSString * format in dateFormatsToTry) { 
    [dateFormatter setDateFormat:format]; 
    NSDate *date = [[[self class] sharedDateFormatter] dateFromString:dateString]; 
    if (date) { 
     return date; 
    } 
} 

// try and figure out the date if the all of the expected formats failed to 
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate error:nil]; 
NSTextCheckingResult *result = [detector firstMatchInString:dateString options:0 range:NSMakeRange(0, [dateString length])]; 
if ([result resultType] == NSTextCheckingTypeDate) { 
    NSDate * date = [result date]; 
    if (date) { 
     return date; 
    } 
} 

return [NSDate date]; // default to now :(
관련 문제