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
Swift 3 - Comparing Date objects
提问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 Date
objects 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)中,这不再起作用了。以下是一些截图:
As you can see in both screenshots, these are two Date
objects. But I get the following error:
正如您在两个屏幕截图中看到的,这是两个Date
对象。但我收到以下错误:
What am I doing wrong? The functions are still declared in the Date
class:
我究竟做错了什么?函数仍然在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
Date
is Comparable
& Equatable
(as of Swift 3)
Date
是Comparable
& Equatable
(从 Swift 3 开始)
This answer complements @Ankit Thakur's answer.
这个答案补充了@Ankit Thakur 的答案。
Since Swift 3 the Date
struct (based on the underlying NSDate
class) adopts the Comparable
and Equatable
protocols.
从 Swift 3 开始,Date
结构体(基于底层NSDate
类)采用Comparable
和Equatable
协议。
Comparable
requires thatDate
implement the operators:<
,<=
,>
,>=
.Equatable
requires thatDate
implement the==
operator.Equatable
allowsDate
to use the default implementation of the!=
operator (which is the inverse of theEquatable
==
operator implementation).
Comparable
要求Date
实现运算符:<
,<=
,>
,>=
。Equatable
要求Date
实现==
运算符。Equatable
允许Date
使用!=
运算符的默认实现(与运算Equatable
==
符实现相反)。
The following sample code exercises these comparison operators and confirms which comparisons are true with print
statements.
下面的示例代码练习这些比较运算符,并使用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) }