2012-06-05 14 views
9

다음 코드는 문제를 보여줍니다 실패?추가 년간의 구성 요소는

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:1]; 
[components setMonth:1]; 
[components setYear:1435]; 


NSCalendar *islamic = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar]; 
NSDate *date = [islamic dateFromComponents:components]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setCalendar:islamic]; 
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 

NSLog(@"%@", [dateFormatter stringFromDate:date]); // -> 01.01.1435 

NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; 
[offsetComponents setYear:1]; 

NSDate *dateWithOffset = [islamic dateByAddingComponents:offsetComponents toDate:date options:0]; 

NSLog(@"%@", [dateFormatter stringFromDate:dateWithOffset]); 
// -> 30.12.1435 ... WHY NOT 01.01.1436 ???? 
+0

해결책은 아니지만 문제의 범위를 좁히는 데 도움이 될 수 있습니다. 그레고리력과 같은 다른 유형을 사용하여 초기 달력을 만들려고 했습니까? 이것을 시도하고이 문제가 여전히 발생하여 이슬람 구성 요소의 가능성을 배제하거나 협소화 할 수 있는지 확인하십시오. – Dima

+0

다른 캘린더 (그레고리 안, 히브리어, 불교)를 사용하면 알고리즘이 제대로 작동하는 것처럼 보입니다. 적어도 최소한 보았습니다. 대부분의 이슬람 시대에도 효과가 있지만 일부는 그렇지 않습니다. –

+0

새 프로젝트를 만들고 코드를 복사했습니다. iOS 4.3, 5.0 및 5.1에서 예상되는 결과를 얻었습니다. 'Muh. 1, 1435'와'Muh. 1, 1436' –

답변

3

여름철/겨울 (일광 절약 시간제)의 차이로 인한 것입니다. Muh. 1, 1435는 2013 년 11 월 5 일에 머무르는 반면 Muh는 1, 1436은 2014 년 10 월 25 일에 시작됩니다. 첫 번째 날짜는 동절기이며 두 번째는 여름철입니다.

처음 만든 NSDate는 2013 년 11 월 5 일 00:00 (자정)입니다. "dateByAddingComponents :"는 구성 요소를 초 단위로 변환하고 첫 번째 날짜에 추가하여 작동합니다. 이 경우 결과는 여름철로 인해 2014 년 10 월 24 일 23:00입니다.

이렇게하면 시간대간에 일광 절약 시간 차이가 있기 때문에 결과가 전세계 다른 사람들에게 다를 수 있습니다.

대신 (순수 날짜로 작업 할 때 일반적으로 좋은 생각입니다) 자정, 정오에 첫 데이트를 설정하여 문제를 방지 할 수 있습니다

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:1]; 
[components setMonth:1]; 
[components setYear:1435]; 
[components setHour:12]; 

지금이 올바른지 "dateByAddingComponents"의 동작은 또 다른 질문입니다.

+0

좋은 인수 :-) 나는 시간대를 자세히 조사하고 이에 대한 피드백을 제공하고자합니다. 지금 나는 서두르고있다. 그래서 나는 인내심을 간구해야한다. –

+0

당신의 의혹이 옳았다 : calendar, dateFormatter 및 NSDateComponents의 timeZone (비 일광 절약 시간 값)을 명시 적으로 설정하면 예상되는 값을 얻을 수 있습니다. –

관련 문제