我正在将我的应用程序更新为Swift 3.0语法(我知道它仍然处于测试阶段,但我想在它发布后立即做好准备)。
直到之前的Xcode Beta(Beta 5),我能够使用操作数Date
,<
和>
比较两个==
对象。但在最新的测试版(Beta 6)中,这已不再适用了。以下是一些截图:
正如您在两个屏幕截图中看到的,这些是两个Date
对象。但我得到以下错误:
我究竟做错了什么?这些函数仍然在Date
类中声明:
static func >(Date, Date)
如果左手Date比右手Date更晚,则返回true。
这只是一个Beta bug还是我做错了什么?
我试过这个片段(在XCode 8 Beta 6中),它运行正常。
let date1 = Date()
let date2 = Date().addingTimeInterval(100)
if date1 == date2 { ... }
else if date1 > date2 { ... }
else if date1 < date2 { ... }
另一种方法:
switch date1.compare(date2) {
case .orderedAscending:
break
case .orderedDescending:
break;
case .orderedSame:
break
}
var strDateValidate = ""
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let firstDate = dateFormatter.date(from:lblStartTime.text!)
let secondDate = dateFormatter.date(from:lblEndTime.text!)
if firstDate?.compare(secondDate!) == .orderedSame || firstDate?.compare(secondDate!) == .orderedAscending {
print("Both dates are same or first is less than scecond")
strDateValidate = "yes"
}
else
{
//second date is bigger than first
strDateValidate = "no"
}
if strDateValidate == "no"
{
alertView(message: "Start date and end date for a booking must be equal or Start date must be smaller than the end date", controller: self)
}
斯威夫特5:
1)如果您使用日期类型:
let firstDate = Date()
let secondDate = Date()
print(firstDate > secondDate)
print(firstDate < secondDate)
print(firstDate == secondDate)
2)如果使用String类型:
let firstStringDate = "2019-05-22T09:56:00.1111111"
let secondStringDate = "2019-05-22T09:56:00.2222222"
print(firstStringDate > secondStringDate) // false
print(firstStringDate < secondStringDate) // true
print(firstStringDate == secondStringDate) // false
我不确定或第二种选择是否100%有效。但是,我不会更改firstStringDate和secondStringDate的值多少结果是正确的。
Date
is Comparable
& Equatable
(as of Swift 3)这个答案补充了@Ankit Thakur的答案。
自Swift 3以来,Date
结构(基于潜在的NSDate
类)采用Comparable
和Equatable
协议。
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: ", ")
}
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是可比的,所以我们可以直接比较日期
let date1 = Date()
let date2 = Date()
let isGreater = date1 > date2
print(isGreater)
let isSmaller = date1 < date2
print(isSmaller)
let isEqual = date1 == date2
print(isEqual)
或者我们可以在日期创建扩展
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
}
}
使用:let isEqual = date1.isEqualTo(date2)
看看这个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()
使用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 dateA.compare(dateB) == .orderedAscending {
datePickerTo.date = datePicker.date
}
//OR
if case .orderedAcending = dateA.compare(dateB) {
}
对我来说问题是我有自己的Date类扩展,它定义了所有的比较运算符。现在(因为swift 3)Date可以比较,不需要这些扩展。所以我评论了它们并且它起作用了。
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
}
}
要使用它:
if (checkTimeStamp(date:"2016-11-21 12:00:00") == false) {
// Do something
}
为了比较日期只有年 - 月 - 日,没有时间,我这样工作:
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本身支持将Dates与所有比较运算符(即<
,<=
,==
,>=
和>
)进行比较。您还可以比较可选日期,但仅限于<
,==
和>
。如果您需要使用<=
或>=
比较两个可选日期,即
let date1: Date? = ...
let date2: Date? = ...
if date1 >= date2 { ... }
你可以重载<=
和>=
operators以支持选项:
func <= <T: Comparable>(lhs: T?, rhs: T?) -> Bool {
return lhs == rhs || lhs < rhs
}
func >= <T: Comparable>(lhs: T?, rhs: T?) -> Bool {
return lhs == rhs || lhs > rhs
}
extension Date {
func isBetween(_ date1: Date, and date2: Date) -> Bool {
return (min(date1, date2) ... max(date1, date2)).contains(self)
}
}
let resultArray = dateArray.filter { $0.dateObj!.isBetween(startDate, and: endDate) }