Подтвердить что ты не робот

Swift 3 - Сравнение объектов Date

Я обновляю свое приложение до синтаксиса Swift 3.0 (я знаю, что он все еще в бета-версии, но я хочу быть готовым, как только он будет выпущен).

До предыдущей бета-версии Xcode (бета-версия 5) мне удалось сравнить два объекта Date, используя операнды <, > и ==. Но в последней бета-версии (бета-версия 6) это уже не работает. Вот несколько скриншотов:

введите описание изображения здесь введите описание изображения здесь

Как вы можете видеть на обоих снимках экрана, это два объекта Date. Но я получаю следующую ошибку: введите описание изображения здесь

Что я делаю неправильно? Функции все еще объявлены в классе Date:

static func >(Date, Date)

Возвращает true, если левая дата даты более поздняя, ​​чем правая Дата.

Является ли это просто бета-ошибкой или я что-то делаю неправильно?

4b9b3361

Ответ 1

Я попробовал этот фрагмент (в XCode 8 Beta 6), и он работает нормально.

let date1 = Date()
let date2 = Date().addingTimeInterval(100)

if date1 == date2 { ... }
else if date1 > date2 { ... }
else if date1 < date2 { ... }

Ответ 2

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

Ответ 3

от 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)

Ответ 4

Смотри это 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) {

 }

Ответ 5

Для меня проблема заключалась в том, что у меня было собственное расширение класса Date, которое определяло все операторы сравнения. Теперь (начиная с быстрого 3), что Дата сопоставима, эти расширения не нужны. Поэтому я прокомментировал их, и это сработало.

Ответ 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
}

Ответ 7

Чтобы сравнить дату только с год-месяц-день и без меня, я работал следующим образом:

     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

На момент написания этой статьи 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
}

Ответ 9

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

Еще один способ сделать это:

    switch date1.compare(date2) {
        case .orderedAscending:
            break

        case .orderedDescending:
            break;

        case .orderedSame:
            break
    }

Ответ 11

   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

Свифт 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, результат оказался верным.