2011-09-06 3 views
5

이 코드NSCalendar의 dateFromComponents : 대신 systemTimeZone

NSCalendar *calendar =[NSCalendar currentCalendar]; 
[gregorian setTimeZone:tz]; 

NSLog(@"%@", [gregorian timeZone]); 

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:[NSDate date]]; 

[comp setDay:info.day]; 
[comp setMonth:info.month]; 
[comp setYear:info.year]; 
[comp setHour:info.hour]; 
[comp setMinute:info.minute]; 
[comp setSecond:info.second]; 
[comp setTimeZone:tz]; 

NSLog(@"%@", [comp timeZone]); 
NSLog(@"%@", [gregorian dateFromComponents:comp]); 

의 GMT 시간대 콘솔에서 다음을 보여줍니다

Europe/Moscow (MSKS) offset 14400 (Daylight) 

Europe/Moscow (MSKS) offset 14400 (Daylight) 

2011-08-31 20:00:00 +0000 

그래서, 일정 및 구성 요소의 시간대가 제대로 지정되어 있지만,있는 NSDate 값을 [gregorian dateFromComponents:comp] 반환 잘못된 시간대 (GMT).

올바른 시간대를 얻으려면 무엇을 교정해야합니까?

+2

( NSDateFormatter 및 데이터 포맷 설명서를 참조하십시오). 어쨌든,'NSDate' 객체에는 시간대에 대한 개념이 전혀 없습니다. 기준 날짜로부터 측정 된 ** 절대 ** 순간을 나타냅니다. 'NSDateFormatter'를 사용하여 다른 시간대에 대한 날짜의 다른 사람이 읽을 수있는 * 표현 *을 얻을 수 있지만, 표현은 그것들입니다. – albertamg

+0

NSDate는 시간 소인의 중요하지 않은 비트에서 파생 된 시간대를 숨 깁니다. 이것은 [NSDate description]에 대해서만 사용하기위한 것이며, 최선으로 신뢰할 수 없습니다. –

+0

그래, 네 말이 맞아. 감사합니다. 이제 알겠습니다. – Mitry

답변

6

보고있는 출력이 정상입니다. NSDate 객체를 직접 NSLog하면, description 메쏘드가 반환하는 것은 무엇이든 얻을 수 있습니다. 이것은 GMT로 표현 된 날짜입니다 (돌로 새겨 져 있지는 않습니다).

NSDate 개체에는 시간대가 적용되지 않습니다. NSDate은 참조 날짜로부터 측정 된 시간으로 즉각적으로 절대을 나타냅니다. 예를 들어, 작성 당시 현재 날짜는 337035053.199801 (초로부터의 초)과 같으며 2011-09-06 20:50:53 GMT 또는 2011-09-06 22:50:53 CEST과 같이 나타낼 수 있습니다. 둘 다 과 동일한 사람이 읽을 수있는 표현인데 날짜입니다.

결론적으로, 적절한 시간대를 얻으려면 무엇이 필요합니까? 원하는 모든 시간대에 NSDate의 문자열 표현을 얻으려면 NSDateFormatter을 사용해야합니다.

+0

NSDate는 GMT를 참조합니다. – zaph

+1

참고 날짜는 사실 2001 년 1 월 1 일 GMT의 첫 번째 순간입니다. 어쨌든, 이것은 '0.0'과 같이 카운트를 시작한 시점을 나타내며 시간대를 사용하여 해당 시점을 표현할 수 있습니다. – albertamg

+0

그리고 우주 공간, 특히 시간대. – zaph

1

이 질문은 꽤 자주 발생하며 대답은 NSDateFormatter을 사용하여 날짜 형식의 원하는 출력을 얻는 것입니다. 현재는 항상 GMT 표준 시간대로 인쇄됩니다.

토론 표현은 운영 시스템의 서로 다른 버전에서 를 일정하게 유지 보장되지
: 여기 NSDate에 대한 문서에 대한 토론입니다. 당신이 직접`NSDate`object을 NSLog 경우 에게 날짜를 포맷하려면 대신 날짜 포맷터 객체를 사용한다 당신은 항상 GMT 표현을 얻을 것이다,