我正在使用NSDateFormatter
将一系列日期转换为一个月内的周数。
我使用的日期格式代码是yyyyMMW
,我读过的所有内容都告诉我W将介于1-5之间。
但是,2013年6月2日是星期日(格里高利历中一周的默认开始日),即使正确计算了一周的开始日期,它的周数也会报告为0:
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
一些快速而肮脏的测试代码,用于重现上面显示的日志:
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");
}
}
有什么想法吗?在任何情况下的周数为0似乎对我来说都是错误的。
由于
答案 0 :(得分: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
但在您的情况下,日期格式化程序使用当前日历,因此具有单独的参数firstWeekDay
和minimumDaysInFirstWeek
。这些参数取决于区域设置。如果我在iOS模拟器上测试这个,并将“Region Format”设置为“German - > Germany”,那么
[[dateFormatterWeekly calendar] firstWeekday] = 2
[[dateFormatterWeekly calendar] minimumDaysInFirstWeek] = 4
我假设您将拥有相似的值,因为现在我得到的输出与您相同。
现在为日期格式化程序,本周从星期一开始,这意味着6月2日是从5月27日开始的一周。这在6月份计为“第0周”,因为只有本周的一天是六月,但minimumDaysInFirstWeek = 4
。一个月的第一周至少有一个
minimumDaysInFirstWeek
天,计为“第1周”。
(我在这里找到了minimumDaysInFirstWeek
参数的相关性:
http://www.cocoabuilder.com/archive/cocoa/326845-week-of-month-confusion.html)