2016-10-20 13 views
0

私はランダムな日付を使用して前の月曜日を計算するために以下のコードを使用しています。どの作業ファイルが、来年のdate.belowに私のコードブレークが同じのためのコードです:NSCalendarは、翌年の第1週の前週の月曜日が間違った日付を返します

NSDate *date = [NSDate dateWithTimeIntervalSince1970:1483620311.228]; 
NSLog(@"current date ===> : %@", date); 

NSCalendar *calendar; 
calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
[calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en-US"]]; 
NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"Australia/Sydney"]; 
[calendar setTimeZone:zone]; 

NSDateComponents *nowComponents = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitWeekday | NSCalendarUnitWeekOfYear | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitTimeZone fromDate:date]; 
if (nowComponents.weekday == 1) { //If my date fall in sunday then I am moving to previous week. 
    [nowComponents setWeekOfYear:[nowComponents weekOfYear]-1]; 
} 

[nowComponents setWeekday:2]; //Monday 

NSDate *previousMonday = [calendar dateFromComponents:nowComponents]; 
NSLog(@"previousMonday date ===> : %@", previousMonday); 

がログに私のように取得しています:

現在の日付===>:2017-01- 05 12時45分11秒0000
previousMonday日===>:2018年1月1日12時45分11秒0000

私は他のスタックオーバーフローのリソースを見てきましたが、解決策を期待得ていません。

答えて

1

nextDateAfterDateNSCalendarとすると、よりスマートな方法があります。これは、タイムゾーンとロケールが本当に重要ではありません。この場合、単一コンポーネントNSCalendarUnitWeekday == 2

NSDate *date = [NSDate dateWithTimeIntervalSince1970:1483620311.228]; 
NSLog(@"current date ===> : %@", date); 
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDate *previousMonday = [calendar nextDateAfterDate:date 
             matchingUnit:NSCalendarUnitWeekday 
               value:2 
              options:NSCalendarMatchNextTime | NSCalendarSearchBackwards]; 
NSLog(@"previousMonday date ===> : %@", previousMonday); 

の試合のために逆方向に検索することができます。

+0

ありがとうございます。それは私のために働く。私のコードが間違った価値をプリントしている理由を知っていますか? – kaushal

+0

私はこの質問に答えるために質問のタイトルを変更する必要があります。質問のタイトルと一致しないためです。 – kaushal

+0

エラーは、ロケールが 'en_US'に設定されている場合にのみ発生します。私はこれをバグと見なします。 – vadian

関連する問題