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

Tom*_*mer 37 nsdate swift

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

谢谢

Kib*_*ibo 100

我找到了更早的日期方法.

if date1.earlierDate(date2).isEqualToDate(date1)  {
     print("date1 is earlier than date2")
}
Run Code Online (Sandbox Code Playgroud)

你也有laterDate

Switf3:

if date1 < date2  {
     print("date1 is earlier than date2")
}
Run Code Online (Sandbox Code Playgroud)

  • swift3使它更简单:只需使用<运算符 (3认同)

Vag*_*ner 35

有一种简单的方法可以做到这一点.(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)
}
Run Code Online (Sandbox Code Playgroud)

如果您需要没有时间的比较日期("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
} 
Run Code Online (Sandbox Code Playgroud)

Apple docs链接到这里.

编辑1:重要

来自Swift 3 迁移说明:

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

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


192*_*2kb 23

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

if (futureDate.timeIntervalSinceNow.sign == .plus) {
    // date is in future
}
Run Code Online (Sandbox Code Playgroud)

if (dateInPast.timeIntervalSinceNow.sign == .minus) {
    // date is in past
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案更具可读性并且更有意义 (2认同)

Nic*_*arr 11

您不需要在此处扩展NSDate,只需使用文档中所示的"比较"即可.

例如,在Swift中:

if currentDate.compare(myDate) == NSComparisonResult.OrderedDescending {
    println("myDate is earlier than currentDate")
}
Run Code Online (Sandbox Code Playgroud)

  • @MichelKapelle myDate是NSDate的实例。检查昵称添加的链接,您会在文档中看到它:`func compare(_ other:NSDate)-&gt; NSComparisonResult`,因此:`other`是`myDate`。 (2认同)

mus*_*afa 9

您可以扩展NSDate以符合EquatableComparable协议.这些是Swift中的比较协议,允许熟悉的比较运算符(==,<,>等)与日期一起使用.将以下内容放在适当命名的文件中,例如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
}
Run Code Online (Sandbox Code Playgroud)

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

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

if date1 < date2 {
    print("ok")
}
Run Code Online (Sandbox Code Playgroud)

有关Swift扩展的信息,请参阅此处.有关Equatable和Comparable协议的信息,请分别参见此处此处.

注意:在这种情况下,我们不是创建自定义运算符,而是仅扩展现有类型以支持现有运算符.