3

たとえば、1/6 -12 (金曜日) の NSDate を取得し、その曜日を調べようとしました。私の週は月曜日に始まるので、金曜日は平日 5 になります。

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [calendar setFirstWeekday:2];
    NSDateComponents *components = [calendar components:NSWeekdayCalendarUnit fromDate:firstOfJulyDate];
    NSLog(@"weekday %i",components.weekday);

出力: 平日 6

setFirstWeekday を何に設定しても、出力は常に 6 になります。何が間違っていますか?

4

3 に答える 3

9

次のようにしてみてください。

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setFirstWeekday:2]; // Sunday == 1, Saturday == 7
NSUInteger adjustedWeekdayOrdinal = [gregorian ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]];
NSLog(@"Adjusted weekday ordinal: %d", adjustedWeekdayOrdinal);
于 2012-06-13T17:09:12.027 に答える
7

NSDateComponents のドキュメントにあるように:

曜日の単位は 1 ~ n の数字で、n は 1 週間の日数です。たとえば、グレゴリオ暦では、n は 7 で、日曜日は 1 で表されます。

この値は、それが使用されるカレンダーのコンテキストで解釈されます。「日付と時刻のプログラミング ガイド」の「カレンダー、日付コンポーネント、およびカレンダーの単位」を参照してください。

そして、NSGregorianCalendar を見ると、予想どおり、1 ~ 7 の意味が日曜日~土曜日として定義されています。

setFirstWeekday:2 を呼び出すことは、月の第 2 週であるかどうかなどを計算するために、週が月曜日から始まることを意味します。月曜日が突然日曜日になるという意味ではありません。2012 年 6 月 1 日はまだ木曜日ではなく金曜日なので、5 ではなく 6 になります。

平日ではなく、週の初めから何日かを知りたい場合は、簡単です。

(components.weekday - calendar.firstWeekday + 1) % 7
于 2012-06-13T19:54:32.510 に答える
3

NSDateComponentsは、すべてのコンポーネントを自動的に同期しません。次に例を示します。

NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *component = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSWeekdayCalendarUnit fromDate:date];

currentMonth = component.month;


// printing the next 3 month's start dates MUST have the setYear! 

for (int i = currentMonth; i < currentMonth + 3; i++) {

    [components setDay:1];
    [components setMonth:i];
    [components setYear:2014];

    NSDate *newDate = [calendar dateFromComponents:components];

    NSDateComponents *components2 = [calendar components:NSDayCalendarUnit |NSMonthCalendarUnit | NSWeekdayCalendarUnit fromDate:newDate];

    monthInt = [components2 month];
    weekIndex = [components2 weekday];
}

日付が次の年にまたがるようにコーディングしてください (ループの前に単純な if ステートメントを含めます)。

于 2014-06-03T02:02:21.167 に答える