1

任意の日付が与えられた場合、その月の次の週の最初の日付を見つける必要があります。月の最終週は 7 日未満になる場合があるため、現在の日付に 7 日を加算するだけの簡単な方法ではないことに注意してください。これが私が今使っているコードです:

    NSCalendar* calendar = [NSCalendar currentCalendar];
    NSDateComponents* components = [calendar components:NSWeekOfMonthCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSDayCalendarUnit fromDate:currentDate];

    NSLog(@"week of month: %ld", [components weekOfMonth]);

    [components setWeekOfMonth:[components weekOfMonth] + 1];
    NSLog(@"new week of month: %ld", [components weekOfMonth]); //week of month is now 2

    [components setWeekday:1];
    NSDate *nextWeek = [calendar dateFromComponents:components];

例として、currentDate は 2012-10-01 に設定されます。この例では、nextWeek は常に 2012-10-01 です。送信しても、オブジェクトsetWeekOfMonth:内の他の日付コンポーネントは増加しないようです。NSDateComponents間違った日付コンポーネントを構成していますか、それともsetWeekOfMonth:そのように機能するはずがありませんか?

4

2 に答える 2

8

NSDateそれでは.... anと anから始めましょうNSCalendar:

NSDate *date = ...;
NSCalendar *cal = [NSCalendar currentCalendar];

その日付が何曜日かを計算します。

NSInteger weekdayOfDate = [cal ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date];
NSInteger numberOfDaysToStartOfCurrentWeek = weekdayOfDate - 1;

その日付を次の週に移動しましょう。

NSDateComponents *oneWeek = [[NSDateComponents alloc] init];
[oneWeek setWeek:1]; // add one week
[oneWeek setDay:-numberOfDaysToStartOfCurrentWeek]; // ... and subtract a couple of days to get the first day of the week
NSDate *startOfNextWeek = [cal dateByAddingComponents:oneWeek toDate:date options:0];

この時点で、次の週の最初の日を指す日付があります。ここで、それがまだ同じ月であることを確認する必要があります。

NSDateComponents *monthOfNextWeek = [cal components:NSMonthCalendarUnit fromDate:startOfNextWeek];
NSDateComponents *monthOfThisWeek = [cal components:NSMonthCalendarUnit fromDate:date];
if ([monthOfNextWeek month] != [monthOfThisWeek month]) {
  // the first day of the next week is not in the same month as the start date
}

これを実行すると、来週の開始日が 2012 年 12 月 30 日であることがわかります (私のカレンダーの週は日曜日から始まるため、日曜日です)。

ただし、週の最初の日を月曜日に開始したい場合は、このコードの前に次のように記述できます。

[cal setFirstWeekday:2]; // the first day of the week is the second day (ie, Monday, because Sunday = 1)

これを行うと、startOfNextWeek2012 年 12 月 31 日の結果になります。

于 2012-12-27T16:11:49.207 に答える
0

これは有効な答えになりますか:

NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"EEE"];

NSDate *date=[NSDate date];
NSString *dateString=[dateFormatter stringFromDate:date];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *components = [NSDateComponents new];

[calendar setFirstWeekday:1];//1 for Mon

NSDate *newDate=date;

while (![dateString isEqualToString:@"Mon"]) {
    components.day = 1;
    newDate = [calendar dateByAddingComponents:components toDate:newDate options:0];
    dateString=[dateFormatter stringFromDate:newDate];
}
NSLog(@"Upcoming week Date=%@",newDate);
于 2012-12-28T07:09:37.363 に答える