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. これらのパラメーターはロケールに依存します。「Region Format」を「German -> Germany」に設定してiOSシミュレーターでこれをテストすると、

[[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 )

于 2013-06-03T17:57:08.700 に答える