9

下面的代码显示了问题:从 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 ????
4

1 回答 1

3

我的怀疑是因为夏季/冬季(夏令时)的差异。嗯。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”的正确行为是另一个问题。

于 2012-06-10T14:49:14.290 回答