检查一个NSDate是否大于另一个

46
if (datStartDate > datEndDate) {

这似乎不起作用。我知道有一个isEqual等方法,但如何执行“大于”比较?

有两个NSDate


可能是重复的问题 如何比较两个NSDate:哪一个更近? - Pang
7个回答

147

我所知道的最简单方法是:

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

其他答案已经讲解了compare:,我想再添加一些个人见解 ;)


没有必要使用这个想法,因为我们有“-compare:”方法。但是这个想法肯定是可行的。 - WINSergey
一行代码就足以使用它。+1。 - GeneCode
这段代码确实很吸引人(并且很有风味),但我认为它可能会对非常接近的NSDate返回错误的答案,因为存在浮点计算和比较精度问题。最好使用“compare:”或添加更易读的语义包装器-(BOOL) isEarlierThan:和-(BOOL) isLaterThan:到现有的-(BOOL) isEqual:中。 - Motti Shneor

32

要比较日期,请使用-compare:方法:

返回值说明:

  • 接收器和另一个日期完全相等,返回NSOrderedSame
  • 接收器晚于另一个日期,返回NSOrderedDescending
  • 接收器早于另一个日期,返回NSOrderedAscending

20

那么关于这个问题...

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

感谢您的阅读。 - Supertecnoboff

13

如果你使用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 ) {
    ...
}

使用“自然语言”构建字符串已完全弃用,这将无法编译。 - lewis

2

接受答案的 Swift 2 版本:

if firstDate.timeIntervalSinceDate(secondDate) > 0 {
    // firstDate is greater (further in the future) than secondDate
}

1
if ([startDate compare:endDate] == NSOrderedAscending) {
        NSLog(@"startDate is EARLIER than endDate");
}

1

我已经使用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"扩展,它只需对"orderedDescending"返回"true"即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接