NSCalendar的dateBySettingUnit方法返回不明显的结果

时间:2016-09-30 06:54:28

标签: ios objective-c nscalendar

我的问题由NSDateComponents解决,但我想理解为什么这个方法有效

ionic cordova run android

结果是:

NSDate *today = [NSDate date];
NSLog(@"today is: %@", today);

NSDate *dayChanged = [calendar dateBySettingUnit:(NSCalendarUnitDay)
                                           value:10
                                          ofDate:today
                                         options:0];
NSLog(@"dayChanged is: %@", dayChanged);

NSDate *monthChanged = [calendar dateBySettingUnit:(NSCalendarUnitMonth)
                                             value:5
                                            ofDate:today
                                           options:0];
NSLog(@"monthChanged is: %@", monthChanged);

为什么today is: 2016-09-30 06:40:36 +0000 dayChanged is: 2016-10-10 00:00:00 +0000 monthChanged is: 2017-05-01 00:00:00 +0000 会增加下一个更大的单位?

2 个答案:

答案 0 :(得分:1)

有趣的是,dateBySettingUnit的行为可能是出乎意料的"因为所有组件实际上都绑定在一起。根据{{​​1}}头文件文档(强调我的):

  

此处的具体行为尚未明确;例如,如果我   将工作日更改为星期四,这是否会进入下一个工作日,   回到上一个,或到最近的星期四?可能的规则   是算法会尝试产生一个结果   下一个更大的单位到给定的那个(那里是这个映射的表格   本文档的顶部)。所以对于"设置为星期四"例如,找到   给定日期所在的星期四(可能   是向前或向后移动,而不一定是最近的   星期四)。对于前进或后退行为,可以使用   -nextDateAfterDate:matchingUnit:value:options:上面的方法。

因此,根据您的需要,使用NSCalendar可能更合适。

答案 1 :(得分:1)

根据观察,dateBySettingUnit does not return past date

因此,对于使用dateBySettingUnit进行快速测试设置以便将来日期按预期工作,请参阅以下代码:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *today = [NSDate date];
NSLog(@"today is: %@", today);

NSDate *dayChanged = [calendar dateBySettingUnit:(NSCalendarUnitDay)
                                           value:31
                                          ofDate:today
                                         options:NSCalendarWrapComponents];
NSLog(@"dayChanged is: %@", dayChanged);

NSDate *monthChanged = [calendar dateBySettingUnit:(NSCalendarUnitMonth)
                                             value:12
                                            ofDate:dayChanged
                                           options:NSCalendarWrapComponents];
NSLog(@"monthChanged is: %@", monthChanged);

日志:

2016-09-30 12:58:30.506 TestRegex[3785:72957] today is: 2016-09-30 07:58:30 +0000
2016-09-30 12:58:30.508 TestRegex[3785:72957] dayChanged is: 2016-09-30 19:00:00 +0000
2016-09-30 12:58:30.509 TestRegex[3785:72957] monthChanged is: 2016-11-30 19:00:00 +0000

您可以尝试在实际计算偏移量的链接答案中提到的NSCalendar扩展名,或者您可以使用NSDateComponents 溶液:

 NSDateComponents *comps = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:today];
[comps setCalendar:calendar];
[comps setDay:5];

希望有所帮助!