ios Swift 3 - 比较日期对象

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/39018335/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 09:57:33  来源:igfitidea点击:

Swift 3 - Comparing Date objects

iosxcodeswift3beta

提问by beeef

I'm updating my app to Swift 3.0 syntax (I know it's still in beta but I want to be prepared as soon as it released).

我正在将我的应用程序更新为 Swift 3.0 语法(我知道它仍处于测试阶段,但我想在它发布后尽快做好准备)。

Until the previous Beta of Xcode (Beta 5) I was able to compare two Dateobjects using the operands <, >and ==. But in the latest beta (Beta 6) this isn't working any more. Here are some screenshots:

在之前的 Xcode 测试版(测试版 5)之前,我能够Date使用操作数<>和来比较两个对象==。但是在最新的测试版(Beta 6)中,这不再起作用了。以下是一些截图:

enter image description hereenter image description here

在此处输入图片说明在此处输入图片说明

As you can see in both screenshots, these are two Dateobjects. But I get the following error: enter image description here

正如您在两个屏幕截图中看到的,这是两个Date对象。但我收到以下错误: 在此处输入图片说明

What am I doing wrong? The functions are still declared in the Dateclass:

我究竟做错了什么?函数仍然在Date类中声明:

static func >(Date, Date)

Returns true if the left hand Date is later in time than the right hand Date.

static func >(Date, Date)

如果左侧 Date 在时间上晚于右侧 Date,则返回 true。

Is this just a Beta bug or am I doing something wrong?

这只是一个 Beta 错误还是我做错了什么?

回答by Ankit Thakur

I have tried this snippet (in XCode 8 Beta 6), and it is working fine.

我已经尝试过这个片段(在 XCode 8 Beta 6 中),它工作正常。

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

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

回答by Mobile Dan

Dateis Comparable& Equatable(as of Swift 3)

DateComparable& Equatable(从 Swift 3 开始)

This answer complements @Ankit Thakur's answer.

这个答案补充了@Ankit Thakur 的答案。

Since Swift 3 the Datestruct (based on the underlying NSDateclass) adopts the Comparableand Equatableprotocols.

从 Swift 3 开始,Date结构体(基于底层NSDate类)采用ComparableEquatable协议。

  • Comparablerequires that Dateimplement the operators: <, <=, >, >=.
  • Equatablerequires that Dateimplement the ==operator.
  • Equatableallows Dateto use the default implementation of the !=operator (which is the inverse of the Equatable==operator implementation).
  • Comparable要求Date实现运算符:<, <=, >, >=
  • Equatable要求Date实现==运算符。
  • Equatable允许Date使用!=运算符的默认实现(与运算Equatable==符实现相反)。

The following sample code exercises these comparison operators and confirms which comparisons are true with printstatements.

下面的示例代码练习这些比较运算符,并使用print语句确认哪些比较为真。

Comparison 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: ",  ")
}

Sample Use

样品使用

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

回答by Suhit Patil

from Swift 3 and above, Date is Comparableso we can directly compare dates like

Swift 3 及以上版本开始,Date is Comparable所以我们可以直接比较日期,例如

let date1 = Date()
let date2 = Date()

let isGreater = date1 > date2
print(isGreater)

let isSmaller = date1 < date2
print(isSmaller)

let isEqual = date1 == date2
print(isEqual)

Alternatively We can create extension on Date

或者我们可以在日期上创建扩展

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
  }
}

Use:let isEqual = date1.isEqualTo(date2)

用:let isEqual = date1.isEqualTo(date2)

回答by Luis Abreu Acevedo

Look this http://iswift.org/cookbook/compare-2-dates

看看这个 http://iswift.org/cookbook/compare-2-dates

Get Dates:

获取日期:

// Get current date
let dateA = NSDate()

// Get a later date (after a couple of milliseconds)
let dateB = NSDate()

Using SWITCH Statement

使用 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")
}

using IF Statement

使用 IF 语句

 if dateA.compare(dateB) == .orderedAscending {
     datePickerTo.date = datePicker.date
 }

 //OR

 if case .orderedAcending = dateA.compare(dateB) {

 }

回答by Jitendra Kulkarni

For me the problem was that I had my own extension to Date class that was defining all the compare operators. Now (since swift 3) that Date is comparable, these extensions are not needed. So I commented them out and it worked.

对我来说,问题是我有自己的 Date 类扩展,它定义了所有的比较运算符。现在(从 swift 3 开始)日期是可比的,不需要这些扩展。所以我把它们注释掉了,它奏效了。

回答by N.B

SWIFT 3: Don't know if this is what you're looking for. But I compare a string to a current timestamp to see if my string is older that now.

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
        }
    }

To use it:

要使用它:

if (checkTimeStamp(date:"2016-11-21 12:00:00") == false) {
    // Do something
}

回答by Alessandro Mattiuzzi

To compare date only with year - month - day and without time for me worked like this:

仅将日期与年 - 月 - 日进行比较并且没有时间对我来说是这样工作的:

     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)")
                        }

回答by zdravko zdravkin

If you want to ignore seconds for example you can use

例如,如果您想忽略秒,则可以使用

func isDate(Date, equalTo: Date, toUnitGranularity: NSCalendar.Unit) -> Bool

func isDate(Date, equalTo: Date, toUnitGranularity: NSCalendar.Unit) -> Bool

Example compare if it's the same day:

示例比较是否是同一天:

Calendar.current.isDate(date1, equalTo: date2, toGranularity: .day)

回答by NSExceptional

As of the time of this writing, Swift natively supports comparing Dates with all comparison operators (i.e. <, <=, ==, >=, and >). You can also compare optional Dates but are limited to <, ==, and >. If you need to compare two optional dates using <=or >=, i.e.

在编写这本书的时候,斯威夫特原生支持比较所有比较操作的日期(即<<===>=,和>)。您还可以比较可选的日期,但仅限于<==>。如果您需要使用<=或比较两个可选日期>=,即

let date1: Date? = ...
let date2: Date? = ...
if date1 >= date2 { ... }

You can overload the <=and >=operators to support optionals:

您可以重载<=>=运算符以支持可选项:

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
}

回答by Arjun Patel

extension Date {
 func isBetween(_ date1: Date, and date2: Date) -> Bool {
    return (min(date1, date2) ... max(date1, date2)).contains(self)
  }
}

let resultArray = dateArray.filter { ##代码##.dateObj!.isBetween(startDate, and: endDate) }