Swift 3 - 날짜 객체 비교
앱을 Swift 3.0 구문으로 업데이트하고 있습니다(아직 베타 버전인 것은 알지만 출시되는 대로 준비하고 싶습니다).
Xcode의 이전 베타(Beta 5)까지 저는 두 가지를 비교할 수 있었습니다.Date피연산자를 사용한 객체<,>그리고.==하지만 최신 베타(베타 6)에서는 더 이상 작동하지 않습니다.다음은 몇 가지 스크린샷입니다.
두 스크린샷에서 볼 수 있듯이, 두 개의 스크린샷이 있습니다.Date물건들.그러나 다음 오류가 발생합니다.
내가 뭘 잘못하고 있는 거지?기능은 여전히 에서 선언됩니다.Date클래스:
static func >(Date, Date)왼쪽 날짜가 오른쪽 날짜보다 늦은 경우 true를 반환합니다.
이것은 단지 베타 버그인가요 아니면 제가 뭔가 잘못하고 있나요?
저는 이 스니펫(Xcode 8 베타 6)을 시도해 보았는데, 잘 작동하고 있습니다.
let date1 = Date()
let date2 = Date().addingTimeInterval(100)
if date1 == date2 { ... }
else if date1 > date2 { ... }
else if date1 < date2 { ... }
Date이라Comparable&Equatable(스위프트 3 기준)
이 대답은 @Ankit Thakur의 대답을 보완합니다.
스위프트 3 이후로Date구조(기본값 기준)NSDateclass) 및 프로토콜을 채택합니다.
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 이상부터 날짜는 비교 가능하므로 다음과 같은 날짜를 직접 비교할 수 있습니다.
let date1 = Date()
let date2 = Date().addingTimeInterval(50)
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)
대/소문자 사용 안 함<,>,==,!=.
사용하다compare(_ other: Date)기능.
사용.
// Get current date
let dateA = Date()
// Get a later date (after a couple of milliseconds)
let dateB = Date()
// Compare them using switch
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")
}
// Compare them using if
if dateA.compare(dateB) == .orderedAscending {
datePickerTo.date = datePicker.date
}
저에게 문제는 모든 비교 연산자를 정의하는 Date 클래스의 확장자가 있다는 것이었습니다.이제 (swift 3) 날짜가 비교 가능하므로 이러한 확장은 필요하지 않습니다.그래서 저는 그들을 논평했고 그것은 효과가 있었습니다.
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
}
예를 들어 초를 무시하려면 다음을 사용할 수 있습니다.
funcisDate(날짜, 동일한 날짜: 날짜, 단위 입도: NSC 일정).단위) -> Bool
같은 날인지 비교하는 예:
Calendar.current.isDate(date1, equalTo: date2, toGranularity: .day)
날짜를 년 - 월 - 일만 비교하고 시간이 없는 경우 다음과 같이 작업했습니다.
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)")
}
글을 이 작 를 성 는 시 와 즉 점 문 기 으 비 연 로 산 자 교 모 든 연 지 합 원 비 를 니 교 다 날 산 짜 의 자 교 서 비 든 모 적 한 본 부 터 ▁( ▁comparing ▁dates 와 , ▁as i ▁compar ▁with ▁all ▁swift ly 즉 ▁writing ▁native ▁supports ▁of ison 이 지 합<,<=,==,>=,그리고.>인 날짜를 이 로 제한됩니다.<,==,그리고.> 를 사용하여 <=또는>=를 들어 예를 들어.
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
}
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) }
다른 방법:
switch date1.compare(date2) {
case .orderedAscending:
break
case .orderedDescending:
break;
case .orderedSame:
break
}
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)
}
스위프트 5:
날짜 유형을 사용하는 경우:
let firstDate = Date()
let secondDate = Date()
print(firstDate > secondDate)
print(firstDate < secondDate)
print(firstDate == secondDate)
문자열 유형을 사용하는 경우:
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의 값을 얼마나 변경하지 않으면 결과가 정확합니다.
Swift 3.4에서는 "비교"를 사용해야 합니다.예:
DateArray.sort { (($0)?.compare($1))! == .orderedDescending }
언급URL : https://stackoverflow.com/questions/39018335/swift-3-comparing-date-objects
'programing' 카테고리의 다른 글
| 설치된 Eclipse가 32비트 버전인지 64비트 버전인지 확인하는 방법은 무엇입니까? (0) | 2023.05.04 |
|---|---|
| 교차()의 반대쪽 (0) | 2023.05.04 |
| Postgre 실행명령줄에서 SQL 쿼리 (0) | 2023.05.04 |
| Eclipse를 제거하는 방법은 무엇입니까? (0) | 2023.05.04 |
| 모든 핵심 데이터 관계에 역관계가 있어야 합니까? (0) | 2023.05.04 |

