1

我正在使用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对来说都是错误的。

谢谢

4

1 回答 1

1

有多种参数会导致这种效果。首先,您没有为日期格式化程序设置日历。如果你添加

[dateFormatterWeekly setCalendar:calendar];

到您的代码,然后输出将如您预期的那样:

日期=20130531,周=2013055,周开始=20130526
日期=20130602,周=2013062,周开始=20130602
日期=20130603,周=2013062,周开始=20130602

但在您的情况下,日期格式化程序使用当前日历,因此具有单独的参数firstWeekDayminimumDaysInFirstWeek. 这些参数取决于区域设置。如果我在“区域格式”设置为“德语 -> 德国”的 iOS 模拟器上对此进行测试,那么

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

我假设你会有相似的值,因为现在我得到了和你一样的输出。

现在对于日期格式化程序,一周从星期一开始,这意味着 6 月 2 日是从 5 月 27 日开始的那一周。这在 6 月算作“第 0 周”,因为本周只有一天是在 6 月,但是minimumDaysInFirstWeek = 4. 一个月中至少有 minimumDaysInFirstWeek几天的第一周算作“第 1 周”。

(我在这里找到了minimumDaysInFirstWeek参数的相关性:http: //www.cocoabuilder.com/archive/cocoa/326845-week-of-month-confusion.html

于 2013-06-03T17:57:08.700 回答