2

基準日が与えられると、次の「水曜日」を見つける必要があります。

明確にするために、参照日が火曜日の場合、同じ週の水曜日を返す必要があります。

基準日が水曜日以降の場合は、翌週から翌水曜日を返却する必要があります

参照日を過ぎた水曜日を返さないことが重要です。

私は使用を検討してきましたがNSDateComponents、常に将来でなければならない次の曜日を取得する方法がわかりません。

これは私がこれまでに持っているものです:

NSDate *referenceDate = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:referenceDate];
[dateComponents setWeekday:4]; // Wednesday
NSDate *followingWednesday = [calendar dateFromComponents:dateComponents];

このコードは、同じ週の過去の水曜日と次の水曜日を区別しませんが、私の問題があります。

今週の日付と来週の日付の 2 つの日付を生成し、if ステートメントを使用してどちらが将来のものかを確認できることはわかっていますが、これは単純なことを行うには多くのコードのように思えます。

より良い方法はありますか?

どんな助けでも大歓迎です。


アップデート

dateComponents:平日を設定しても、実際にはNSCalendarのメソッドで返される日付には影響しないようです。上記のコード例は、曜日の設定に関係なく同じ日付を返します。

だから今、私はもっと困惑しています。

4

5 に答える 5

4

私は次のようにします:

NSDate *referenceDate = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit) fromDate:referenceDate];

int targetWeekday = 4;

if (dateComponents.weekday >= targetWeekday)
{
    dateComponents.week++;
}

dateComponents.weekday = targetWeekday;
NSDate *followingTargetDay = [calendar dateFromComponents:dateComponents];
于 2012-11-02T11:34:43.983 に答える
2

NSDateFormatter を通過する必要があります。次の水曜日を計算するために、このようなことを行うことができます。あなたが何を望んでいるかはわかりませんが、例を次に示します。

NSDate *referenceDate = [NSDate date];
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *mincomp = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:referenceDate];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"e"];
while ([[formatter stringFromDate:[cal dateFromComponents:mincomp]] intValue] != 4)
    mincomp.day += 1;
[formatter setDateFormat:@"yyyy-MM-dd"];
NSLog(@"next wednesday = %@", [formatter stringFromDate:[cal dateFromComponents:mincomp]]);
于 2012-11-02T11:35:27.673 に答える
1

使用するdateWithNaturalLanguageString

NSDate *date = [NSDate dateWithNaturalLanguageString:@"next Wednesday"];
NSLog(@"%@",date);

: dateWithNaturalLanguageString:

指定された文字列で指定された日付と時刻に設定された NSDate オブジェクトを作成して返します。

+ (id)dateWithNaturalLanguageString:(NSString *)string

パラメーター

ストリング

「先週の火曜日の夕食」、「2001 年 12 月 31 日午後 3 時」、「12/31/01」、「31/12/01」など、口語的な日付指定を含む文字列。</p>

于 2012-11-02T11:54:43.513 に答える
0

昨日たまたま取り組んだ実装が別のコンピューター上にあるため、全体をうまく結び付けていませんが、大まかに:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"e"];
NSInteger day = [[formatter stringFromDate:theDate] integerValue];
NSInteger offsetDays = (targetDay - day);  // targetDay is 4 for Wednesday
if (offsetDays < 0) offsetDays += 7;
NSDate* resultDate = [theDate dateByAddingTimeInterval:offsetDays * secondsInADay];

(offsetDays の計算は少し厄介かもしれません。そのようなことは、朝のこの時間に利用できる以上のことを考える必要があります。)

于 2012-11-02T12:19:17.790 に答える