Swift 3 - 比较Date对象

bee*_*eef 87 beta xcode ios swift3

我正在将我的应用程序更新为Swift 3.0语法(我知道它仍处于测试阶段,但我想在发布后立即做好准备).

直到之前的Xcode Beta(Beta 5),我能够Date使用操作数比较两个对象<,>并且==.但在最新的测试版(Beta 6)中,这已不再适用了.以下是一些截图:

在此输入图像描述 在此输入图像描述

正如您在两个屏幕截图中看到的,这些是两个Date对象.但是我收到以下错误: 在此输入图像描述

我究竟做错了什么?这些函数仍然在Date类中声明:

static func >(Date, Date)

如果左手Date比右手Date更晚,则返回true.

这只是一个Beta bug还是我做错了什么?

Ank*_*kur 153

我试过这个片段(在XCode 8 Beta 6中),它运行正常.

let date1 = Date()
let date2 = Date().addingTimeInterval(100)

if date1 == date2 { ... }
else if date1 > date2 { ... }
else if date1 < date2 { ... }
Run Code Online (Sandbox Code Playgroud)


Mob*_*Dan 49

DateComparable&Equatable(截至Swift 3)

这个答案补充了@Ankit Thakur的答案.

从Swift 3开始,Datestruct(基于底层NSDate类)采用ComparableEquatable协议.

  • Comparable需要Date实现运营商:<,<=,>,>=.
  • Equatable要求Date实施==运营商.
  • Equatable允许Date使用!=运算符的默认实现(这是Equatable ==运算符实现的反转).

以下示例代码练习这些比较运算符,并确认哪些比较对于print语句是正确的.

比较功能

import Foundation

func describeComparison(date1: Date, date2: Date) -> String {

    var descriptionArray: [String] = []

    if date1 < date2 {
        descriptionArray.append("date1 < date2")
    }

    if date1 <= date2 {
        descriptionArray.append("date1 <= date2")
    }

    if date1 > date2 {
        descriptionArray.append("date1 > date2")
    }

    if date1 >= date2 {
        descriptionArray.append("date1 >= date2")
    }

    if date1 == date2 {
        descriptionArray.append("date1 == date2")
    }

    if date1 != date2 {
        descriptionArray.append("date1 != date2")
    }

    return descriptionArray.joined(separator: ",  ")
}
Run Code Online (Sandbox Code Playgroud)

样品使用

let now = Date()

describeComparison(date1: now, date2: now.addingTimeInterval(1))
// date1 < date2,  date1 <= date2,  date1 != date2

describeComparison(date1: now, date2: now.addingTimeInterval(-1))
// date1 > date2,  date1 >= date2,  date1 != date2

describeComparison(date1: now, date2: now)
// date1 <= date2,  date1 >= date2,  date1 == date2
Run Code Online (Sandbox Code Playgroud)


Suh*_*til 28

Swift 3及以上版本开始,Date是可比的,所以我们可以直接比较日期

let date1 = Date()
let date2 = Date()

let isGreater = date1 > date2
print(isGreater)

let isSmaller = date1 < date2
print(isSmaller)

let isEqual = date1 == date2
print(isEqual)
Run Code Online (Sandbox Code Playgroud)

或者我们可以在日期创建扩展

extension Date {

  func isEqualTo(_ date: Date) -> Bool {
    return self == date
  }

  func isGreaterThan(_ date: Date) -> Bool {
     return self > date
  }

  func isSmallerThan(_ date: Date) -> Bool {
     return self < date
  }
}
Run Code Online (Sandbox Code Playgroud)

使用: let isEqual = date1.isEqualTo(date2)


小智 14

看看 http://iswift.org/cookbook/compare-2-dates

获取日期:

// Get current date
let dateA = NSDate()

// Get a later date (after a couple of milliseconds)
let dateB = NSDate()
Run Code Online (Sandbox Code Playgroud)

使用SWITCH语句

// Compare them
switch dateA.compare(dateB) {
    case .OrderedAscending     :   print("Date A is earlier than date B")
    case .OrderedDescending    :   print("Date A is later than date B")
    case .OrderedSame          :   print("The two dates are the same")
}
Run Code Online (Sandbox Code Playgroud)

使用IF声明

 if dateA.compare(dateB) == .orderedAscending {
     datePickerTo.date = datePicker.date
 }

 //OR

 if case .orderedAcending = dateA.compare(dateB) {

 }
Run Code Online (Sandbox Code Playgroud)

  • _"&gt;不要使用比较器 &lt;、&gt;、==、!=。"_ ...为什么? (3认同)

Jit*_*rni 9

对我来说问题是我有自己的Date类扩展,它定义了所有的比较运算符.现在(因为swift 3)Date可以比较,不需要这些扩展.所以我评论了它们并且它起作用了.


zdr*_*kin 7

例如,如果您想忽略秒,则可以使用

func isDate(Date, equalTo: Date, toUnitGranularity: NSCalendar.Unit) -> Bool

示例比较是否是同一天:

Calendar.current.isDate(date1, equalTo: date2, toGranularity: .day)
Run Code Online (Sandbox Code Playgroud)


小智 6

SWIFT 3:不知道这是否是您正在寻找的.但我将字符串与当前时间戳进行比较,以查看我的字符串现在是否更旧.

func checkTimeStamp(date: String!) -> Bool {
        let dateFormatter: DateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        dateFormatter.locale = Locale(identifier:"en_US_POSIX")
        let datecomponents = dateFormatter.date(from: date)

        let now = Date()

        if (datecomponents! >= now) {
            return true
        } else {
            return false
        }
    }
Run Code Online (Sandbox Code Playgroud)

要使用它:

if (checkTimeStamp(date:"2016-11-21 12:00:00") == false) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*zzi 5

只比较日期和年月日,没有时间对我来说是这样的:

     let order = Calendar.current.compare(self.startDate, to: compareDate!, toGranularity: .day)  

                      switch order {
                        case .orderedAscending:
                            print("\(gpsDate) is after \(self.startDate)")
                        case .orderedDescending:
                            print("\(gpsDate) is before \(self.startDate)")
                        default:
                            print("\(gpsDate) is the same as \(self.startDate)")
                        }
Run Code Online (Sandbox Code Playgroud)