检查日期是否在当前日期之前(Swift)

时间:2014-11-07 18:09:23

标签: swift nsdate

我想通过将NSDate与当前日期进行比较来检查NSDate是否在之前(过去)。我该怎么做?

由于

9 个答案:

答案 0 :(得分:89)

我找到了earlierDate方法。

if date1.earlierDate(date2).isEqualToDate(date1)  {
     print("date1 is earlier than date2")
}

您还拥有laterDate方法。

斯威夫特3:

if date1 < date2  {
     print("date1 is earlier than date2")
}

答案 1 :(得分:33)

有一种简单的方法可以做到这一点。 (Swift 3更简单,在答案结束时检查)

Swift代码:

if myDate.timeIntervalSinceNow.isSignMinus {
    //myDate is earlier than Now (date and time)
} else {
    //myDate is equal or after than Now (date and time)
}

如果您需要没有时间的比较日期(“MM / dd / yyyy”)。

Swift代码:

//Ref date
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy"
let someDate = dateFormatter.dateFromString("03/10/2015")

//Get calendar
let calendar = NSCalendar.currentCalendar()

//Get just MM/dd/yyyy from current date
let flags = NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitYear
let components = calendar.components(flags, fromDate: NSDate())

//Convert to NSDate
let today = calendar.dateFromComponents(components)

if someDate!.timeIntervalSinceDate(today!).isSignMinus {
    //someDate is berofe than today
} else {
    //someDate is equal or after than today
} 

Apple docs链接here

修改1:重要

来自Swift 3 migration notes

  

迁移器是保守的,但有一些NSDate的用法在Swift 3中有更好的表示:
  (x as NSDate).earlierDate(y)可以更改为x < y ? x : y   (x as NSDate).laterDate(y)可以更改为x < y ? y : x

因此,在Swift 3中,您可以使用比较运算符。

答案 2 :(得分:21)

如果您需要将一个日期与现在进行比较而不创建新的Date对象,您可以在Swift 3中使用它:

if (futureDate.timeIntervalSinceNow.sign == .plus) {
    // date is in future
}

if (dateInPast.timeIntervalSinceNow.sign == .minus) {
    // date is in past
}

答案 3 :(得分:9)

您可以扩展NSDate以符合EquatableComparable协议。这些是Swift中的比较协议,允许熟悉的比较运算符(==,&lt;,&gt;等)与日期一起使用。将以下内容放入适当命名的文件中,例如您项目中的NSDate+Comparison.swift

extension NSDate: Equatable {}
extension NSDate: Comparable {}

public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSince1970 == rhs.timeIntervalSince1970
}

public func <(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSince1970 < rhs.timeIntervalSince1970
}

现在,您可以使用标准比较运算符检查一个日期是否在另一个日期之前。

let date1 = NSDate(timeIntervalSince1970: 30)
let date2 = NSDate()

if date1 < date2 {
    print("ok")
}

有关Swift扩展程序的信息,请参阅here。有关Equatable和Comparable协议的信息,请分别参阅herehere

注意:在这个例子中,我们不是创建自定义运算符,只是扩展现有类型以支持现有运算符。

答案 4 :(得分:9)

您无需在此处扩展NSDate,只需使用docs中所示的“比较”。

例如,在Swift中:

if currentDate.compare(myDate) == NSComparisonResult.OrderedDescending {
    println("myDate is earlier than currentDate")
}

答案 5 :(得分:3)

In Swift 4 you can use this code

if endDate.timeIntervalSince(startDate).sign == FloatingPointSign.minus {
    // endDate is in past
}

答案 6 :(得分:1)

在Swift5中

    let nextDay = Calendar.current.date(byAdding: .day, value: -1, to: Date())
    let toDay = Date()
    print(toDay)
    print(nextDay!)

    if nextDay! < toDay  {
        print("date1 is earlier than date2")
    }


    let nextDay = Calendar.current.date(byAdding: .month, value: 1, to: Date())
    let toDay = Date()
    print(toDay)
    print(nextDay!)

    if nextDay! >= toDay  {
        print("date2 is earlier than date1")
    }

答案 7 :(得分:0)

这是Swift中的扩展程序,用于检查日期是否为过期日期。

extension Date {
    var isPastDate: Bool {
        return self < Date()
    }
}

用法:

let someDate = Date().addingTimeInterval(1)
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    print(date.isPastDate)
}

答案 8 :(得分:-1)

快速制作Swift 2.3功能

// if you omit last parameter you comare with today
// use "11/20/2016" for 20 nov 2016
func dateIsBefore(customDate:String, referenceDate:String="today") -> Bool {

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "MM/dd/yyyy"

    let myDate = dateFormatter.dateFromString(customDate)
    let refDate = referenceDate == "today"
        ? NSDate()
        : dateFormatter.dateFromString(referenceDate)

    if NSDate().compare(myDate!) == NSComparisonResult.OrderedDescending {
        return false
    } else {
        return true
    }
}

像这样使用它来查看您的日期是否在今天的日期

之前
if dateIsBefore("12/25/2016") {
    print("Not Yet Christmas 2016 :(")
} else {
    print("Christmas Or Later!")
}

或使用自定义参考日期

if dateIsBefore("12/25/2016", referenceDate:"12/31/2016") {
    print("Christmas comes before new years!")
} else {
    print("Something is really wrong with the world...")
}