2013-06-03 91 views
1

我正在使用NSDateFormatter將一系列日期轉換爲一個月內的一週數。NSDateFormatter報告2013年6月2日爲零週期

我使用的日期格式代碼是yyyyMMW,我讀過的所有內容都告訴我W將在1-5之間。

但是,2013年6月2日的週日(公曆日期中的默認開始日期)下降,即使本週的開始日期計算正確,但週數仍爲0:

NSDateFormatter *dateFormatDaily = [[NSDateFormatter alloc] init]; 
[dateFormatDaily setDateFormat:@"yyyyMMdd"]; 
NSDateFormatter *dateFormatterWeekly = [[NSDateFormatter alloc] init]; 
[dateFormatterWeekly setDateFormat:@"yyyyMMW"]; 

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
[calendar setFirstWeekday:1]; // default but set here for clarity 

NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setMonth:5]; 
[dateComponents setDay:31]; 
[dateComponents setYear:2013]; 
NSDate *date_1 = [calendar dateFromComponents:dateComponents]; 
[dateComponents setMonth:6]; 
[dateComponents setDay:2]; 
NSDate *date_2 = [calendar dateFromComponents:dateComponents]; 
[dateComponents setDay:3]; 
NSDate *date_3 = [calendar dateFromComponents:dateComponents]; 
NSArray *datesToTest = @[date_1, date_2, date_3]; 

for (NSDate *date in datesToTest) { 
    NSString *weekNo = [dateFormatterWeekly stringFromDate:date]; 
    NSDate *beginningOfWeek = nil; 
    BOOL rc = [calendar rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek interval:NULL forDate:date]; 
    if (rc) { 
     NSLog(@"date=%@, week=%@, start of week=%@", [dateFormatDaily stringFromDate:date], weekNo, [dateFormatDaily stringFromDate:beginningOfWeek]); 
    } else { 
     NSLog(@"Could not calculate beginning of week"); 
    } 
} 

任何想法:

2013-06-03 14:15:45.611 date=20130531, week=2013055, start of week=20130526 
2013-06-03 14:15:45.612 date=20130602, week=2013060, start of week=20130602 
2013-06-03 14:15:45.612 date=20130603, week=2013061, start of week=20130602 

一些快速和骯髒的測試代碼重現日誌上面顯示?在任何情況下,一個星期的數字0在好像是對我來說是錯誤的。

謝謝

+0

+1! –

回答

1

有各種各樣的參數引起這種效應。首先,您沒有爲日期格式化程序設置日曆。如果添加

[dateFormatterWeekly setCalendar:calendar]; 

你的代碼,然後輸出將是您預期的那樣:

 
date=20130531, week=2013055, start of week=20130526 
date=20130602, week=2013062, start of week=20130602 
date=20130603, week=2013062, start of week=20130602 

但在你的情況,日期格式使用當前日曆,因此具有獨立的參數firstWeekDayminimumDaysInFirstWeek。這些參數是區域設置相關的。如果我測試這個在iOS模擬器與「區域格式」設置爲「德國 - >德國」,然後

[[dateFormatterWeekly calendar] firstWeekday]   = 2 
[[dateFormatterWeekly calendar] minimumDaysInFirstWeek] = 4 

,我認爲你將有相似的價值觀,因爲現在我得到的結果相同,你。

現在爲日期格式化程序,一週從星期一開始,這意味着6月2日是在5月27日開始的一週。這在6月計爲「第0周」,因爲只有一天一週是六月,但是minimumDaysInFirstWeek = 4。一個月中的第一週至少有 minimumDaysInFirstWeek天,計爲「第一週」。

(我發現這裏的minimumDaysInFirstWeek參數的相關性: http://www.cocoabuilder.com/archive/cocoa/326845-week-of-month-confusion.html)爲完全獨立的代碼演示問題

+0

感謝Martin R--你的回答非常有幫助,並讓我意識到,使用本月的星期編號並不是正確的方式來做我所需要的。 – Ianp

相關問題