2010-07-14 6 views
7

[[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:date] 두 가지 다른 날짜에 [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:date]을 사용하여 같은 날에 속하는지 확인하려고합니다. 그러나 내 시간대가 다른 경우 (예 : 독일 어딘가), 날짜가 분명히 동일하더라도 반환되는 날짜가 다릅니다. 같은 날짜에 NSEraCalendarUnit 대신 NSYearCalendarUnit을 사용하면 반환 값은 같습니다.NSCalendar의 일일 시간차가 잘못됨

NSYearCalendarUnit을 사용할 때의 유일한 문제점은 다른 연도의 같은 날에 같은 값을 반환한다는 것이고, 다른 연도에 해당하는 경우 두 날짜 간의 일수를 결정하는 것은 간단하지 않습니다.

어떤 아이디어가 잘못 되었습니까? 또는 두 날짜가 같은 날에 있는지 또는 둘 사이의 일 수를 결정하는 데 더 쉬운 방법이 있습니까?

예 :

[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Berlin"]]; 
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDate *date1 = [NSDate dateWithTimeIntervalSinceReferenceDate:300751200]; 
NSDate *date2 = [NSDate dateWithTimeIntervalSinceReferenceDate:300836062.388569]; 

NSLog(@"\nDate 1: %@\nDate 2: %@",date1,date2); 
/*Output: 
Date 1: 2010-07-14 00:00:00 +0200 
Date 2: 2010-07-14 23:34:22 +0200 
*/ 

int day1 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit 
         forDate:date1]; 
int day2 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit 
         forDate:date2]; 

NSLog(@"\nDay 1: %i\nDay 2: %i",day1,day2); 
/*Output: 
    Day 1: 733966 
    Day 2: 733967 
*/ 

day1 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit 
        forDate:date1]; 
day2 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit 
        forDate:date2]; 

NSLog(@"\nDay 1:%i\nDay 2: %i",day1,day2); 
/*Output: 
    Day 1: 195 
    Day 2: 195 
*/ 
+0

동일한 문제가 있습니다. 1시 1 분 GMT의 1 월 1 일 00시 1 분 1 초입니다. NSYearCalendarUnit은 1 월 1 일 00:00:01에 시작하는 것으로 보이지만 NSCalendar 시간대는 GMT가 아닐 수 있습니다. 이것은 왜 시대/연도 결과가 다른지 설명 할 수 있습니다. 버그 보고서를 작성하려고합니다. 이렇게하면 일이 같은 해가 아닌 경우 일차 차이에 대한 법칙 방법은 쓸모 없게됩니다. –

답변

2

참조 http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html : "토론

순서와는 장치의 분해 된 값과 동일하지 대부분이다. 일반적으로 반환 값은 1 이상입니다. 예를 들어, 시간 00:45는 하루 중 첫 번째 시간이고, 시간과 일 단위는 각각 1입니다. 예외는 일주일 단위 계산이며, 첫 번째 달보다 일 전에 0을 반환합니다 날짜가 포함 된 달의 주. "

즉, 23시 34 분 22 초는 까지 오는 마지막 시간에 속합니다. 0을 초과하는 시간은 다음 날과 같습니다.

어쩌면 이것은 버그로 처리 될 수 있습니다. 즉, 처음에는 스물 세 번째부터 까지까지 실행되는 시간이 있습니까? 나는 제안한다 : 버그 보고서를 작성한다.

+0

나는 이해하고 있는지 모르겠다 ... 두 날짜는 분명히 같은 날이지만, 그 시대의 같은 날로 나타나지는 않지만, 그 해의 같은 날로 나타난다. 나는 버그 리포트가 순서대로되어 있다고 생각하지만, 그 동안 임시 해결책이 있습니까? –

+1

시대가 시작될 때마다 다릅니다. 시대가 GMT * 자정에 시작하면 두 날짜가 같은 날 (시대의 시간)에 있지 않습니다. – JeremyP

6

버그가 접수되었지만 Date and Time Programming Guide을 다시 확인했습니다. 목록 13의 코드를 사용하면 (사용자 코드와 유사) 잘못된 동작을 보입니다. 그러나 목록 14를 사용하면 예상대로 작동합니다.

편집 : 개념적으로 Apple은 옳습니다. 예수 그리스도는 다른 모든 사람들과 마찬가지로 절대 시간, 즉 시간대와 관계없이 태어났습니다. 그래서 새로운 시대는 시간대에 관계없이 같은 시점에 시작되었습니다. 새해가 각 시간대의 다른 시점에 있습니다. 이것은 NSYearCalendarUnit와 NSEraCalendarUnit 간의 차이점을 설명 할 수 있습니다. 문제는 그들이 문서에 명시 적으로 언급하지 않았다는 것입니다.