私は自分のアプリをSwift 3.0の構文に更新しています(まだベータ版ですが、リリースされたらすぐに準備しておきたいです)。
以前のXcodeのベータ版(ベータ5)までは、オペランド<
、>
および==
を使用して2つのDate
オブジェクトを比較することができました。しかし、最新のベータ版(ベータ6)ではこれはもう機能しません。これがスクリーンショットです。
両方のスクリーンショットからわかるように、これらは2つのDate
オブジェクトです。しかし、私は次のエラーが出ます:
何がおかしいのですか?関数はまだDate
クラスで宣言されています。
static func >(Date, Date)
左側の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以降では、Dateは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)
代わりに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
}
}
使用: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ステートメントの使用
// 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 datePickerTo.date.compare(datePicker.date) == .orderedAscending {
datePickerTo.date = datePicker.date
}
私にとって問題なのは、すべての比較演算子を定義していたDateクラスに自分で拡張したことです。現在(Swift 3以降)、Dateは比較可能なので、これらの拡張は必要ありません。だから私はそれらをコメントアウトし、それはうまくいった。
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)")
}
それを行う別の方法:
switch date1.compare(date2) {
case .orderedAscending:
break
case .orderedDescending:
break;
case .orderedSame:
break
}
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) }
これを書いている時点で、Swiftはネイティブにすべての比較演算子(すなわち<
、<=
、==
、>=
、および>
)との日付の比較をサポートします。オプションの日付を比較することもできますが、<
、==
、および>
に制限されます。 <=
または>=
を使用して2つのオプションの日付を比較する必要がある場合は、.
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
}
Swift 5:
1)日付タイプを使用する場合
let firstDate = Date()
let secondDate = Date()
print(firstDate > secondDate)
print(firstDate < secondDate)
print(firstDate == secondDate)
2)文字列型を使用する場合
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
よくわからない、または2番目のオプションが100%で機能する。しかし、firstStringDateとsecondStringDateの値をどれだけ変更しても結果は正しくありません。
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)
}