Ответ 1
Я попробовал этот фрагмент (в XCode 8 Beta 6), и он работает нормально.
let date1 = Date()
let date2 = Date().addingTimeInterval(100)
if date1 == date2 { ... }
else if date1 > date2 { ... }
else if date1 < date2 { ... }
Я обновляю свое приложение до синтаксиса Swift 3.0 (я знаю, что он все еще в бета-версии, но я хочу быть готовым, как только он будет выпущен).
До предыдущей бета-версии Xcode (бета-версия 5) мне удалось сравнить два объекта Date
, используя операнды <
, >
и ==
. Но в последней бета-версии (бета-версия 6) это уже не работает. Вот несколько скриншотов:
Как вы можете видеть на обоих снимках экрана, это два объекта Date
. Но я получаю следующую ошибку:
Что я делаю неправильно? Функции все еще объявлены в классе Date
:
static func >(Date, Date)
Возвращает true, если левая дата даты более поздняя, чем правая Дата.
Является ли это просто бета-ошибкой или я что-то делаю неправильно?
Я попробовал этот фрагмент (в 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
.
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 и выше, Дата сопоставима, поэтому мы можем напрямую сравнивать даты как
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 Statement
// 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
if dateA.compare(dateB) == .orderedAscending {
datePickerTo.date = datePicker.date
}
//OR
if case .orderedAcending = dateA.compare(dateB) {
}
Для меня проблема заключалась в том, что у меня было собственное расширение класса Date, которое определяло все операторы сравнения. Теперь (начиная с быстрого 3), что Дата сопоставима, эти расширения не нужны. Поэтому я прокомментировал их, и это сработало.
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 изначально поддерживает сравнение дат со всеми операторами сравнения (т.е. <
, <=
, ==
, >=
и >
). Вы также можете сравнивать дополнительные даты, но ограничены <
, ==
и >
. Если вам нужно сравнить две необязательные даты, используя <=
или >=
, т.е.
let date1: Date? = ...
let date2: Date? = ...
if date1 >= date2 { ... }
Вы можете перегрузить операторы <=
и >=
для поддержки опций:
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) }
Еще один способ сделать это:
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, результат оказался верным.