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

标签 ios objective-c nscalendar

我的问题是通过 NSDateComponents 解决的,但我想了解为什么这个方法如此有效

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

为什么dateBySettingUnit会递增下一个更大的单位?

最佳答案

根据观察,dateBySettingUnit does not return past date

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

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];

希望有帮助!

关于ios - NSCalendar 的 dateBySettingUnit 方法返回不明显的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785430/

相关文章:

ios - 使用 setDoesRelativeDateFormatting : YES and setDateFormat: with NSDateFormatter

ios - 获取当前季度的第一个日期

ios - 我在解析数据方面有问题?

ios - Collection View 中类似表格 View 的动画?

objective-c - 如何设置 UIBarButtonItem 的最大宽度

objective-c - 在 UITableView 中创建 "folders",推送下一个带有内容的 UITableView(无限!)

ios - 在 Swift 2 中使用 NSDateComponents 计算下个月开始的奇怪日期结果

ios - CollectionView 单元格在滚动后更改大小 - AutoLayout

ios分享扩展摄像头

objective-c - 为 NSString 编写 unicode char 格式