2016-09-30 17 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:を使用する方が適切です。観察を1として

+0

異なるオプション '{NSCalendarMatchPreviousTimePreservingSmallerUnits、NSCalendarMatchNextTimePreservingSmallerUnits、NSCalendarMatchNextTime} 'で' nextDateAfterDate:matchingUnit:value:options: 'をチェックしました。 'matchingUnit:NSCalendarUnitDay'の場合、月が –

関連する問題