Swift 3 – 比较date对象

我正在更新我的应用程序Swift 3.0语法(我知道它仍然在testing版,但我想要尽快准备就绪)。

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

在这里输入图像说明 在这里输入图像说明

正如你可以在两个屏幕截图中看到的,这些是两个Date对象。 但是我得到以下错误: 在这里输入图像说明

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

static func >(Date, Date)

如果左边的date比右边的date晚,则返回true。

这只是一个testing版错误,或者我做错了什么?

我已经在XCode 8 beta 6中试过这个代码片段,它工作正常。

 let date1 = Date() let date2 = Date().addingTimeInterval(100) if date1 == date2 { } else if date1 > date2 { } else if date1 < date2 { } 

DateComparable和可Equatable (从Swift 3开始)

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

从Swift 3开始, Date结构(基于底层的NSDate类)采用了ComparableEquatable协议。

  • Comparable要求Date实现运算符: <<=>>=
  • Equatable要求Date实现==运算符。
  • Equatable允许Date使用!=运算符的默认实现(这是Equatable ==运算符实现的逆向)。

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

比较function

 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: ", ") } 

示例使用

 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 

Swift 3中,Date是Comparable,所以我们可以直接比较date

 let date1 = Date() let date2 = Date().addingTimeInterval(1) let isGreater = date1 > date2 print(isGreater) let isSmaller = date1 < date2 print(isSmaller) let isEqual = date1 == date2 print(isEqual) 

对我来说,问题是我有我自己的扩展到Date类,定义了所有的比较运算符。 现在(从swift 3开始)这个date是可比的,这些扩展是不需要的。 所以我评论他们,它的工作。

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

获取date:

 // Get current date let dateA = NSDate() // Get a later date (after a couple of milliseconds) let dateB = NSDate() 

使用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") } 

使用IF声明

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

比较date只有年,月,日,没有时间我这样工作:

  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)") } 

SWIFT 3:不知道这是你在找什么。 但是我将一个string与当前的时间戳进行比较,看看我的string现在是否比较老。

 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 } } 

要使用它:

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