如何在Swift 3.0中比较日期?

8

我有两个日期,想要进行比较。如何比较这两个日期呢?我有两个日期对象,分别是modificationDateupdatedDate

那么,比较日期的最佳实践是什么呢?


2
最佳实践会得到不同的意见。展示“你”是如何比较日期的,并询问是否有更好的方法? - JohnG
请查看这个链接 - Stefan Stefanov
4个回答

11

Date 现在符合 Comparable 协议。因此,您可以使用 <>== 来比较两个 Date 类型的对象。

if modificateionDate < updatedDate {
     //modificateionDate is less than updatedDate
}

1
@AshwinKanjariya,你说你有一个Date实例,那么这个代码应该可以工作。我认为你可能有一个NSDate实例,请先确认一下,把你的代码展示出来。在Swift 3中最好使用Date而不是NSDate - Nirav D
1
@AshwinIndianic 欢迎啊老铁 :) - Nirav D
@AshwinIndianic,现在我知道为什么你不接受我的答案了,因为你正在使用两个账户,并且想从那个答案中接受答案。我已经检查了你的问题http://stackoverflow.com/questions/42336935/archive-is-not-success-due-to-error-code-1-although-i-can-do-build-and-instal,你的工作方式不好,很快你就会知道的。 - Nirav D
@AshwinIndianic,现在你已经更改了用户名,这样就没有人会注意到了,不错的尝试,请继续努力 :) - Nirav D

7

根据@NiravD的回答,Date是可比较的。然而,如果你想要按照给定的精度进行比较,你可以使用Calendarcompare(_:to:toGranularity:)方法。

例如...

let dateRangeStart = Date()
let dateRangeEnd = Date().addingTimeInterval(1234)

// Using granularity of .minute
let order = Calendar.current.compare(dateRangeStart, to: dateRangeEnd, toGranularity: .minute)

switch order {
case .orderedAscending:
    print("\(dateRangeEnd) is after \(dateRangeStart)")
case .orderedDescending:
    print("\(dateRangeEnd) is before \(dateRangeStart)")
default:
    print("\(dateRangeEnd) is the same as \(dateRangeStart)")
}

> 2017-02-17 10:35:48 +0000 is after 2017-02-17 10:15:14 +0000

// Using granularity .hour
let order = Calendar.current.compare(dateRangeStart, to: dateRangeEnd, toGranularity: .hour)

> 2017-02-17 10:37:23 +0000 is the same as 2017-02-17 10:16:49 +0000

谢谢!这个粒度函数正是我需要的。 - derf26

3

Swift iOS 8及以上版本 当你需要比较的不仅仅是日期的大小时。例如,它是同一天还是前一天,...

注意: 永远不要忘记时区。日历时区有一个默认值,但如果您不喜欢默认值,必须自己设置时区。要知道今天是哪一天,您需要知道您所在的时区。

extension Date {
    func compareTo(date: Date, toGranularity: Calendar.Component ) -> ComparisonResult  {
        var cal = Calendar.current
        cal.timeZone = TimeZone(identifier: "Europe/Paris")!
        return cal.compare(self, to: date, toGranularity: toGranularity)
        }
    }

使用方法如下:

if thisDate.compareTo(date: Date(), toGranularity: .day) == .orderedDescending {
// thisDate is a previous day
}

以下是一个更加复杂的使用示例,演示如何在筛选器中使用:

https://dev59.com/yV8e5IYBdhLWcg3wAWcL#45746206


-1

Swift有ComparisonResult,包括orderedAscending、orderedDescending和same如下。

if modificateionDate.compare(updatedDate) == ComparisonResult.orderedAscending {
            //Do what you want
}

希望这能对你有所帮助。


1
Swift没有orderedAscending,但是在Foundation框架中有ComparisonResult - Eric Aya
现在我已经百分之百确定这两个帐户都是由@AshwinIndianic处理的。你认为你更改了用户的名称,然后幸存了下来:P:D,做得很好:-) - Nirav D
谢谢您的关注,但您认为的并不正确...您可以详细说明一下,我不介意。 - Kanjariya-IOS
@Kanjariya-IOS,我注意到的是正确的,你和我都知道:P 如果你们两个是不同的人,那么我的上面的答案应该被"@Ashwin Indianic"接受,因为他在另一个问题中接受了你的答案。 :-) - Nirav D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接