2016-09-30 151 views
1

我的問題是由NSDateComponents解決,但我想知道爲什麼這種方法可行,從而dateBySettingUnit方法返回不明顯結果

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增量下一個較大單元?

回答

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

希望有所幫助!

+0

我明白 - 只有「未來日期」。謝謝你的答案 –

1

有趣的是,dateBySettingUnit的行爲可能是「意想不到的」,因爲所有組件都實際綁定在一起。根據NSCalendar頭文件的文檔(重點我的):

這裏的具體行爲尚未指定;例如,如果I 將工作日更改爲星期四,那麼是否會向前移動到下一個, ,還是到最近的星期四?一個可能的規則 是該算法將嘗試產生一個結果,在 下一個較大的單元到給定的一個(這個映射表在 這個文件的頂部)。因此,對於「設置爲星期四」示例,在給定日期所在的星期四發現 (其中 可能是向前或向後移動,而不一定是最近的 星期四)。對於向前或向後行爲,可以使用上面的 -nextDateAfterDate:matchingUnit:value:options:方法。

因此,根據您的需要,使用nextDateAfterDate:matchingUnit:value:options:可能更合適。

+0

我檢查了'nextDateAfterDate:matchingUnit:value:options:'具有不同選項'{NSCalendarMatchPreviousTimePreservingSmallerUnits,NSCalendarMatchNextTimePreservingSmallerUnits,NSCalendarMatchNextTime}'。對於'matchingUnit:NSCalendarUnitDay',它增加月份 –