2011-04-01 1 views
1

NSDate는 UTC/GMT라는 것을 알고 있습니다. 즉, 시간대 정보가 연결되어 있지 않습니다.NSCalendar 구성 요소가 시간을 고려하지 않음

NSCalendar, NSTimeZone 및 NSDateComponents와 같은 상위 수준의 클래스에는 시간대를 고려합니다.

이를 바탕으로 다음 코드를 사용하여 두 날짜 간의 일 수 차이를 계산합니다. 그러나 계산이 시간을 모두 무시하고 완료되는 것처럼 나는 얻는 결과가 보인다. 나는 틀린 일을하고 있는지 또는 이것이 어떤 이유로 디자인에 의한 것인지 궁금합니다. 여기

코드 및 데이터입니다 :

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *comp = [calendar components:NSDayCalendarUnit fromDate:startDate toDate:stopDate options:0]; 
NSInteger day = [comp day]; 

디버그 출력 :

(gdb) po startDate 
2011-04-01 03:52:13 +0000 
(gdb) po stopDate 
2011-04-03 15:52:13 +0000 
(gdb) p (int) day 
$1 = 2 

시간대는 태평양 표준시 태평양 표준시로 변환 위의 날짜 인은 다음과 같습니다

startDate = 2011-03-31 8:52:13 -7 
stopDate = 2011-04-03 8:52:13 -7 

그러므로 나는 2 일이 아닌 4 일간을 기대한다. (31, 1, 2, 3)

시간이 무시되는 이유는 계산에 시간을 추가하면 2 일과 12 시간이 걸리기 때문입니다.

내가 잘못한 일을하고 있습니까? 아니면 어떻게 작동하도록 설계 되었습니까?

, 감사 그렇진 밴스

답변

0

합니다. 태평양 표준 시간대의 날짜 형식을 지정하면 다음과 같이 표시됩니다.

Calendars[38041:707] start: 2011-03-31 20:52:13 -0700 
Calendars[38041:707] stop : 2011-04-03 08:52:13 -0700 

게시자가 게시 한 것과 약간 다릅니다. 너의 것이 8 시가 아니라 8시를 나타내는 것 같다.

components:fromDate:toDate:options:전체 단위로 계산됩니다. 따라서 일수를 묻는다면, 그들 사이에 2 일간의 하루가 있다고 말할 것입니다.

아마도 당신이 찾고있는 무엇을 할 수있는 더 좋은 방법은 이것이다 :

NSUInteger startOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:startDate]; 
NSUInteger stopOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:stopDate]; 

그런 다음 그들 사이의 일 수는 (stopOrdinal - startOrdinal) 될 것입니다. 귀하의 날짜의 경우, 이것은 3을 산출합니다 (4 월 1 일 GMT - 4 월 3 일 GMT). 정말로 시간 부분을 무시하고 싶다면, 목표 시간대 내의 날짜 중 시간 부분을 잘라내는 방법을 알아 내야 할 것입니다. 여기에는 날짜를 NSDateComponent 개의 개체로 변환 한 다음 -hour, -minute-second 부분을 0으로 설정해야합니다. 작업을 완료하면 NSDates으로 다시 변경 한 다음 차이 계산을 계속 진행할 수 있습니다.