将年份组件添加到伊斯兰日历失败

时间:2012-06-05 13:14:22

标签: objective-c ios nscalendar nsdatecomponents

以下代码显示问题:从1435年的第一天开始整整一年不会导致1436年的第一天。

我缺少什么想法?

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 ????

1 个答案:

答案 0 :(得分:3)

我怀疑是因为夏季/冬季(夏令时)的差异。 MUH。 1,1435属于2013年11月5日,而Muh。 1,1366将于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”的正确行为是另一个问题。