Fra*_*tin 9 objective-c nscalendar nsdatecomponents ios
以下代码显示了问题:从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 ????
Run Code Online (Sandbox Code Playgroud)
我的怀疑是因为夏季/冬季(夏令时)的差异。嗯。1435年1月1日是2013年11月5日,而Muh。1436 年 10 月 1 日是 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];
Run Code Online (Sandbox Code Playgroud)
现在,这是否是“dateByAddingComponents”的正确行为是另一个问题。
| 归档时间: |
|
| 查看次数: |
762 次 |
| 最近记录: |