2012-11-06 4 views
1

날짜에서 YEAR, MONTH 및 DAY 구성 요소를 사용하여 날짜를 0 시간, 0 분, 0 초로 설정하는 다음 코드가 있습니다. :예상 된 결과가 아닌 시간을 설정하는 NSDate

NSDate *date = [NSDate date]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *comps = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date]; 
NSDate *newDate = [gregorian dateFromComponents:comps]; 
NSLog(@"date: %@, newDate: %@", date, newDate); 

출력은 다음과 같습니다

date: 2012-11-06 11:44:09 +0000, newDate: 2012-11-05 23:00:00 +0000 

하지만 새로운 날짜가 될 것으로 예상했다 : 2012-11-06 00:00:00 +0000 내가 아는 것을 무슨 일 ?

답변

1

NSLog 차례로, 문자열로 NSDate에 저장되어있는 절대 시간을 변환 -[NSDate description]를 사용하여 날짜를 표시합니다. 이 변환은 시간대로 UTC를 사용하여 수행됩니다.

경우에 따라 UTC로 날짜 계산을하는 것이 가장 좋습니다. 이렇게하려면 계산을 수행하는 달력 개체를 조정하십시오.

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
-1

비슷한 스택 오버 플로우 질문에 대해서는 this answer을 참조하십시오.

이 일광 절약하여 문제를 해결해야합니다

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; 

[formatter setCalendar:[NSCalendar currentCalendar]]; 
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 

NSString *string = [formatter stringFromDate:[NSDate date]]; 
+0

위의 포맷터 설정을 사용하여 날짜를 인쇄하는 것은 동일합니다. 서머 타임이 NSDate 작성 또는 달력에 미치는 영향에 대한 설명을 제공 할 수 있습니까? – SolidSun

+0

일광 절약 시간은 장치/사용자 설정의 시간대를 고려하여'[NSDate date]'의 결과에 영향을줍니다. 다른 시간대를 사용하면 다른 시간대와 관련하여 날짜를 결정할 수 있습니다. 내 대답에 대한 편집을 참조하십시오. – CaptainRedmuff

+0

@CaptainRedmuff "일광 절약 시간이 [NSDate date]의 결과에 영향을 미칩니다.": 그건 사실이 아닙니다. 'NSDate'는 달력, 시간대, 로케일 등의 영향을받지 않습니다. NSDate는 절대 시간을 나타냅니다. –