我正在将我的应用更新为Swift 3.0语法(我知道它仍处于测试阶段,但我想在发布后立即做好准备)。
在之前的Xcode测试版(Beta 5)之前,我能够使用操作数Date
,<
和>
来比较两个==
个对象。但在最新的测试版(Beta 6)中,这已不再适用了。以下是一些截图:
正如您在两个屏幕截图中看到的,这些是两个Date
对象。但是我收到以下错误:
我做错了什么?这些函数仍然在Date
类声明:
static func >(Date, Date)
如果左手日期晚于右手日期,则返回true。
这只是一个Beta bug还是我做错了什么?
答案 0 :(得分:137)
我已经尝试过这个片段(在XCode 8 Beta 6中),它运行正常。
let date1 = Date()
let date2 = Date().addingTimeInterval(100)
if date1 == date2 { ... }
else if date1 > date2 { ... }
else if date1 < date2 { ... }
答案 1 :(得分:45)
Date
是Comparable
&amp; Equatable
(截至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
答案 2 :(得分:28)
来自 Swift 3及以上,日期是可比的所以我们可以直接比较日期,如
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)
答案 3 :(得分:12)
看看这个 http://iswift.org/cookbook/compare-2-dates
获取日期:
<?php
if(isset($_GET['page'])){
if($_GET['page']=="gallery"){
include "template/gallery.php";
}
}
else{
include "template/home.php";
}
?>
使用SWITCH语句
// Get current date
let dateA = NSDate()
// Get a later date (after a couple of milliseconds)
let dateB = NSDate()
使用IF声明
// 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")
}
答案 4 :(得分:9)
对我来说问题是我有自己的Date类扩展,它定义了所有的比较运算符。现在(因为swift 3)Date可以比较,不需要这些扩展。所以我对它们进行了评论并且有效。
答案 5 :(得分: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
}
}
使用它:
if (checkTimeStamp(date:"2016-11-21 12:00:00") == false) {
// Do something
}
答案 6 :(得分:6)
例如,如果要忽略秒 您可以使用
func isDate(Date,equalTo:Date,toUnitGranularity:NSCalendar.Unit)-> Bool
比较同一天的示例:
Calendar.current.isDate(date1, equalTo: date2, toGranularity: .day)
答案 7 :(得分: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)")
}
答案 8 :(得分:1)
截至撰写本文时,Swift本身支持将日期与所有比较运算符进行比较(即<
,<=
,==
,>=
和{{1 }})。您还可以比较可选日期,但仅限于>
,<
和==
。如果您需要使用>
或<=
比较两个可选日期,即
>=
您可以重载let date1: Date? = ...
let date2: Date? = ...
if date1 >= date2 { ... }
和<=
运算符以支持选项:
>=
答案 9 :(得分:1)
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) }
答案 10 :(得分:1)
另一种方法:
switch date1.compare(date2) {
case .orderedAscending:
break
case .orderedDescending:
break;
case .orderedSame:
break
}
答案 11 :(得分:0)
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)
}
答案 12 :(得分:0)
快捷键5:
1)如果使用日期类型:
let firstDate = Date()
let secondDate = Date()
print(firstDate > secondDate)
print(firstDate < secondDate)
print(firstDate == secondDate)
2)如果使用字符串类型:
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的值多少才是正确的。
答案 13 :(得分:0)
在Swift 3,4中,您应该使用“比较”。 例如:
DateArray.sort { (($0)?.compare($1))! == .orderedDescending }