現在の日付が特定の日の特定の時間の間にあるかどうかを確認する方法を作成することに興味があります。スケジューリング番組なので、現在どのようなイベントが発生しているかを知りたいです。毎日同じ時間のセットがあります: 820-900、900-940、940-1020 など。これは特定の日に行う必要があるため、特定の時間で NSDate を作成する方法がわかりません。これは NSTimeInterval で行うことができると思いますが、それをインスタンス化する方法がわかりません。
3 に答える
これは完璧ではありませんが、 [NSDate compare:] を使用して、両方の境界に対して日付を確認できます。
NSDate *firstDate = ...
NSDate *secondDate = ...
NSDate *myDate = [NSDate date];
switch ([myDate compare:firstDate]) {
case NSOrderedAscending:
NSLog(@"myDate is older");
// do something
break;
case NSOrderedSame:
NSLog(@"myDate is the same as firstDate");
// do something
break;
case NSOrderedDescending:
NSLog(@"myDate is more recent");
// do something
break;
}
switch ([myDate compare:secondDate]) {
case NSOrderedAscending:
NSLog(@"myDate is older");
// do something
break;
case NSOrderedSame:
NSLog(@"myDate is the same as secondDate");
// do something
break;
case NSOrderedDescending:
NSLog(@"myDate is more recent");
// do something
break;
}
またはもっと簡単に:
BOOL between = NO;
if (([myDate compare:firstDate] == NSOrderedDescending) &&
([myDate compare:secondDate] == NSOrderedAscending)) {
between = YES;
}
複雑な日付比較を行うためのより良い方法があると確信していますが、これはうまくいくはずです。
これを行う最も簡単な方法は、 を使用-timeIntervalSinceReferenceDate
して、各日付をNSTimeInterval
型付きの値に変換することdouble
です。
NSTimeInterval rightNow = [[NSDate date] timeIntervalSinceReferenceDate];
そこから、日付が特定の 2 つの日付の間にあるかどうかを判断するには、単純な数値比較の問題にすぎません。
日付の文字列表現を NSDate インスタンスに変換して時間間隔を取得する必要がある場合は、 NSDateFormatter を使用します。
既知の日付コンポーネントから日付を作成する必要がある場合は、NSCalendarを使用してください。(つまり、年が 2010 年、月が 4 日、日が 12 であることがわかっている場合、NSCalendar のコンポーネントを使用して、-dateFromComponents:
メソッドを介して NSDate インスタンスを生成できます。)
ベンが指摘したように、NSCalendar のコンポーネント インターフェイスを使用して、時間と分を調べて範囲内にあるかどうかを判断することもできます (ほとんどのイベントが毎日同時に発生するわけではないため、これは非典型的な使用方法のようです.. .しかし...確かに...そうする理由もあります!)
-[NSCalendar components:fromDate:] を見てください。日付をさまざまなコンポーネントに「分解」できるようになり、この場合は時と分を見ることができます。