web-dev-qa-db-ja.com

あるNSDateが別のNSDateよりも大きいかどうかの確認

if (datStartDate > datEndDate) {

これは機能していないようです。 isEqualなどがあることは知っていますが、「以上」を実行するにはどうすればよいですか?

両方がNSDateです。

45
Jules

私が知っている最も簡単な方法は:

if( [firstDate timeIntervalSinceDate:secondDate] > 0 ) {

他の回答は比較をカバーしています:、いくつかのフレーバーを追加したかった;)。

140
dannywartnaby

日付を比較するには、-compare: 方法:

次の場合の戻り値:

  • レシーバーとanotherDateは互いに完全に等しいNSOrderedSame
  • レシーバーは、anotherDateよりも遅れていますNSOrderedDescending
  • レシーバーは、anotherDateより前の時間ですNSOrderedAscending
30
Vladimir

どうですか...

if ([datStartDate earlierDate: datEndDate] == datStartDate) {
    // datStartDate is earlier
} else {
    // datEndDate is earlier
}
19
Kevin Mitts

あなたが持っているように NSDates

NSDate *datStartDate = [NSDate dateWithString:@"2010-10-01 03:00:00 +0900"];
NSDate *datEndDate   = [NSDate dateWithString:@"2010-10-01 04:00:00 +0900"];

if ( ([datStartDate compare:datEndDate]) == NSOrderedDescending ) {
    ...
}
11
martin clayton

受け入れられた回答のSwift 2バージョン:

if firstDate.timeIntervalSinceDate(secondDate) > 0 {
    // firstDate is greater (further in the future) than secondDate
}
2
brandonscript
if ([startDate compare:endDate] == NSOrderedAscending) {
        NSLog(@"startDate is EARLIER than endDate");
}
1
joan

私は何年もNSDateとNSComparisonの結果を処理してきましたが、これがどのように機能するかを一生覚えることはできません。それで、私はDateに便利な拡張機能を書きました:

func isBefore(_ otherDate: Date) -> Bool {
    let result = self.compare(otherDate)
    switch result {
    case .orderedAscending:
        return true
    case .orderedSame,
         .orderedDescending:
        return false
    }
}

isAfter拡張機能が必要な場合は、trueに対してorderedDescendingを返す必要があります。

1
DesignatedNerd