2016-10-20 49 views
0

我使用下面的代碼使用隨機日期來計算前一週的週一。其工作文件,但明年date.below我的代碼休息是相同的代碼:NSCalendar返回錯誤的日期爲上週一在第一個星期明年

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

相關問題