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 { }
Date
是Comparable
和可Equatable
(从Swift 3开始)
这个答案补充了@Ankit Thakur的答案。
从Swift 3开始, Date
结构(基于底层的NSDate
类)采用了Comparable
和Equatable
协议。
-
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 }