2011-07-31 2 views
2

이전에는 타임 스탬프를 사용한 다음 86400 초 (24 * 60 * 60)를 더했습니다. stackoverflow에 관한 최근의 질문을 읽으면서 그것이 매일 바뀌지 않는다는 것을 지적하면서 이것을 바꾸고 싶습니다.NSDate 및 다음 날

그럼 내가 생각해 낸 다음 것은 NSDateComponents를 사용하는 것입니다. 나는 현재의 날을 얻고 1을 더한다. 지금 나는 그것이 얼마나 똑똑한 지 궁금해하고 있었다. 하루가 31 일 경우처럼 하루를 1로, 월을 +1로 (또는 다시 12 대 1로) 설정합니까? 이 수동으로 할 수 있지만 gregian 달력에 대해서만 제대로 작동 할 것입니다 그래서 난 정말 좋은 해결책이 될지 여부를 모르겠다 ..

답변

3

당신이 바보가되고 싶지 않는 한 그것은 똑똑하다. the documentation for -[NSCalendar dateByAddingComponents:toDate:options]에서

:

당신이 더 높은 단위로 (당신은 0 패스) 단위로 오버 플로우가 수행 아무 옵션을 지정하지 않으면 (일반 추가로). 당신이 하지이 단위가 더 높은 단위로 넘쳐하고자했다면

는, 당신은 options: 매개 변수의 값으로 "NSWrapCalendarComponents"를 전달할 것이다.

+0

쿨, 고마워요 - 내 코드에서이 버그를 알려준 트위터 야 btw : P –

0

DST에 매우주의하십시오. 다양한 시간대에 따라 다릅니다. 그리고 자정에 발생합니다 [NSCalendar 날짜 추가] : [날짜 : 옵션]을 호출하고 날짜가 오후 11-12시 사이라면 DST로 인해 하루가 누락되거나 재실행 될 위험이 있습니다. 이 문제를 해결하려면 날짜를 정오로 변경하고 요일을 추가하는 것이 좋습니다.

// increment by 1 calendar day 
// and convert back to NSDate objects 
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease]; 
[comps setDay:1]; 

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
[gregorian setTimeZone:self.myTimeZone]; // time zone of location; 

// Use local noontime for the date to avoid problems around 
// midnight, particularly near daylightsavings time discontinuities. 
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
NSDateComponents* dateComponents = [gregorian components:unitFlags fromDate:date]; 

dateComponents.hour = 12; 
NSDate* noonDate = [gregorian dateFromComponents:dateComponents]; 

NSDate *newDate = [gregorian dateByAddingComponents:comps toDate:noonDate options:0]; 

옵션 : 0 설정에 대해 확실하지 않지만이 테스트를 철저히 테스트했습니다. 10 일간의 날짜 배열을 얻으 려합니다. 그것은 다양한 일/월/년 불연속 주위에 올바른 포장을 제공합니다. 테스트하려는 경우 SunPose Rise Set를 앱 스토어에서 확인하십시오. (예, 무료입니다)