現在の日付が NSDate を使用して日付範囲内にあるかどうかを調べようとしています。
たとえば、NSDate を使用して現在の日付/時刻を取得できます。
NSDate rightNow = [NSDate date];
次に、その日付を使用して、午前 9 時から午後 5 時までの範囲内にあるかどうかを確認したいと思います。
現在の日付が NSDate を使用して日付範囲内にあるかどうかを調べようとしています。
たとえば、NSDate を使用して現在の日付/時刻を取得できます。
NSDate rightNow = [NSDate date];
次に、その日付を使用して、午前 9 時から午後 5 時までの範囲内にあるかどうかを確認したいと思います。
私は解決策を思いつきました。より良い解決策がある場合は、そのままにしておいてください。正しいものとしてマークします。
+ (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate
{
if ([date compare:beginDate] == NSOrderedAscending)
return NO;
if ([date compare:endDate] == NSOrderedDescending)
return NO;
return YES;
}
最初の部分では、@kperryua からの回答を使用して、比較する NSDate オブジェクトを作成します。あなた自身の質問に対するあなたの答えから、あなたはそれを理解したようです.
実際に日付を比較するために、私はあなたの答えに対する@Timのコメントに完全に同意します。より簡潔ですが、実際にはコードとまったく同じです。その理由を説明します。
+ (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}
return ステートメントは && 演算子の両方のオペランドを評価する必要があるように見えるかもしれませんが、実際にはそうではありません。鍵となるのは「短絡評価」で、これはさまざまなプログラミング言語で実装されており、確かに C で実装されています。基本的には、最初の引数が 0 (または NO、nil など) の場合は演算子&
と&&
「短絡」です。 、 while |
、||
最初の引数が0でないdate
場合は同じことを行いbeginDate
ます。基本的に、コードと同じことを行いますが、5 (または空白を含む 7) ではなく、1 行の 1 つのステートメントで行います。NO
endDate
これは、プログラマーが特定のプログラミング言語が論理式を評価する方法を理解すると、効率をあまり気にせずに、より効果的に論理式を構築できるため、建設的な入力として意図されています。ただし、すべてのオペレーターが短絡するわけではないため、効率の悪い同様のテストがあります。(実際、数値比較演算子のように、ほとんどの演算子は短絡できません。) 疑問がある場合は、ロジックを分解する際に明示的に指定することは常に安全ですが、言語/コンパイラに小さなことを処理させると、コードがはるかに読みやすくなります。あなたのために。
Swift のブロック ウルフ バージョン:
extension NSDate
{
func isBetweenDates(beginDate: NSDate, endDate: NSDate) -> Bool
{
if self.compare(beginDate) == .OrderedAscending
{
return false
}
if self.compare(endDate) == .OrderedDescending
{
return false
}
return true
}
}
現在の日付が 2 つの特定の時点 (2009 年 7 月 1 日の午前 9 時から午後 5 時) の間にあるかどうかを知りたい場合は、NSCalendar と NSDateComponents を使用して、目的の時間の NSDate インスタンスを構築し、それらを現在の日付と比較します。
現在の日付が毎日この 2 時間の間にあるかどうかを知りたい場合は、おそらく逆の方法をとることもできます。NSCalendar と NSDate を使用して NSDateComponents オブジェクトを作成し、時間コンポーネントを比較します。
これは、次のように日付の時間間隔を使用して簡単に実現できます。
const NSTimeInterval i = [date timeIntervalSinceReferenceDate];
return ([startDate timeIntervalSinceReferenceDate] <= i &&
[endDate timeIntervalSinceReferenceDate] >= i);
この問題には、より適切で迅速な解決策があります。
extention Date {
func isBetween(from startDate: Date,to endDate: Date) -> Bool {
let result = (min(startDate, endDate) ... max(startDate, endDate)).contains(self)
return result
}
}
次に、このように呼び出すことができます。
todayDate.isBetween(from: startDate, to: endDate)
この拡張機能は、どれが最小でどれがそうでないかをチェックするため、日付をランダムに渡すこともできます。
Swift 3以降で使用できます。
Swift のより良いバージョン:
@objc public class DateRange: NSObject {
let startDate: Date
let endDate: Date
init(startDate: Date, endDate: Date) {
self.startDate = startDate
self.endDate = endDate
}
@objc(containsDate:)
func contains(_ date: Date) -> Bool {
let startDateOrder = date.compare(startDate)
let endDateOrder = date.compare(endDate)
let validStartDate = startDateOrder == .orderedAscending || startDateOrder == .orderedSame
let validEndDate = endDateOrder == .orderedDescending || endDateOrder == .orderedSame
return validStartDate && validEndDate
}
}