2012-07-25 3 views
0

나는 날짜가 많이 작동하는 응용 프로그램을 개발하고이 방법을 사용하여 핵심 데이터의 문자열로 다음을 저장합니다 날짜 작업NSRepublicOfChinaCalendar와 NSGregorianCalendar의 차이점은 무엇입니까?

- (NSDate*) stringToDate{ 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"yy-MM-dd HH:mm"]; 
    NSDate *date = [dateFormat dateFromString:self]; 

    return date; 

}

을/시간은 매우 까다 롭습니다 - 혼자 시간 시스템과 지역 시간의 차이 - 어쨌든 위의 방법은이를 처리해야합니다. 많은 계산이 같은도 있습니다

(A는 NSString에있는 NSDate를 포맷하면 대신 내 경우에는 2 시간 차이를 보여줍니다 디버거에서있는 NSDate 변수를 보는 올바른 현지 시간을 반환하기 때문에 그래서, 희망) :

NSCalendar *calendar = [NSCalendar currentCalendar]; <------ 

    NSDateComponents *components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit |NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:someDate]; 

    NSInteger now_hour = [components hour]; 
    NSInteger now_minute = [components minute]; 
    NSInteger yearx = [components year]; 
    NSInteger monthx = [components month]; 
    NSInteger dayx = [components day]; 

특정 날짜/시간을 설정/변경/생성하고, 계산을 수행하고, NSString으로 핵심 데이터에서 다시 검색/저장해야합니다.

제 질문은 적절한 달력을 사용하는 것입니다.

나는 항상 작성해야 :

NSCalendar *calendar = [NSCalendar currentCalendar]; ? 

또는

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

및 ESP
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSRepublicOfChinaCalendar]; 

. 앱이 유럽/미국 대 중국에서 사용되는지 여부에 따라?

+0

doc에서 따옴표 : '중국 달력을 만들 수 있고 그 달력으로 계산할 수 있지만 필요한 기본 기능이 아직 제대로 작동하지 않아 서식 지정에 사용하면 안됩니다.' – nhahtdh

답변

2

귀하의 방법 stringToDate은 정확히 작동하지 않습니다. QA1480을 참조하십시오. 짧은 버전 : NSDateFormatter에는 유감스럽게도 특정 텍스트 형식을 디코딩하고 인코딩하고 표시 할 날짜를 변환하는 두 가지 모순이있는 역할이 있습니다. 후자는 로케일과 관련되어 있으므로 기본값입니다. 이전 동작을 확실히하려면 en_US_POSIX 로켈을 명시 적으로 설정해야합니다.이 로케일은 날짜 문자열을 정확하게 준수하도록 보장됩니다.

그런데, 당신은 NSDate에 대해 약간 혼란스러워 보입니다. NSString 또는 날짜의 서면 표현이 아닙니다. 정확한 순간을 추상화 한 기록입니다. 따라서 현재 캘린더와 완전히 관련이 없습니다. 사용자의 달력 및 로캘은 날짜 인쇄 방법에 영향을 미치지 만 날짜 자체에는 영향을주지 않습니다. 지금은 여전히 ​​지금이지만, 당신은 그것을 쓰십시오. 그렇기 때문에 날짜에 포맷터를 적용하면 올바른 현지 날짜가 표시되지만 콘솔에 날짜를 기록하면 현지 시간대가 아닌 추상적 인 내용을 얻을 수 있습니다. NSDate에는 시간대 또는 다른 캘린더 개념이 없습니다.

핵심 데이터는 날짜를 직접 저장할 수 있습니다. 즉, 숫자 값보다 많은 수의 문자열을 수동으로 문자열로 변환 할 필요가 전혀 없습니다. 그래서 나는 당신이 무엇을 얻고 있는지 완전히 확신하지 못합니다. 그러나 정상적인 동작은 사용자에게 무언가를 표시하려는 경우 currentCalendar을 사용하는 것입니다. 시간대 및 기타 설정에 따라 표시됩니다.

QA에 따라 고정 날짜 문자열을 적용하려면 명시 적으로 설정된 로케일을 사용하는 날짜 포맷터를 사용해야하며 달력에 대해 전혀 생각하지 않아야합니다.

+0

뭔가가 있다는 느낌이 들었습니다. 이것에 대해 까다 롭습니다.하지만 결코 그렇게 위험하지는 않을 것입니다. 날짜를 문자열로 변환하는 기본적인 이유는 디버거에서 변수를 볼 때 "이상한"결과 대신 항상 "올바른"날짜/시간을 볼 수 있기 때문에 앱 개발 중에 처리하기가 더 쉬울 것이라고 생각했기 때문입니다 . 문자열에 서식을 지정하고이 서식을 사용하면 이러한 오류가 발생할 수 있음을 알고 있었다면 핵심 데이터가있는 일반 날짜를 사용했을 것입니다. 이제 en_US_POSIX를 사용합니다. 올바르게 작동하는지 확인하십시오. 이것을 지적 해 주셔서 대단히 감사합니다! – user387184

+0

+1 토미는 많은 진실을 말합니다. –

+0

하지만 [NSDate date]를 사용하여 현재 날짜/시간을 얻은 다음 시간 및 분을 저장된 날짜/시간과 비교하면이 작업도 가능합니까? 또는 현지 시간이 완전히 다른데도 저장된 날짜/시간이 미국 시간 (en_US_POSIX를 사용했기 때문에)일까요? – user387184