2013-06-03 92 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

相关问题