我有两个日期对象:
1: 2017-01-13 11:40:17 +0000
2: 2016-03-15 10:22:14 +0000
我需要比较这些值的时间并忽略日期
例如:上午12:00和上午12:01,晚上12:01(上午12:01>上午12:00)== true
这是我最后采用的路线,这使得在swift中比较Date的时间变得容易
新对象时间:
class Time: Comparable, Equatable { init(_ date: Date) { //get the current calender let calendar = Calendar.current //get just the minute and the hour of the day passed to it let dateComponents = calendar.dateComponents([.hour, .minute], from: date) //calculate the seconds since the beggining of the day for comparisions let dateSeconds = dateComponents.hour! * 3600 + dateComponents.minute! * 60 //set the varibles secondsSinceBeginningOfDay = dateSeconds hour = dateComponents.hour! minute = dateComponents.minute! } init(_ hour: Int, _ minute: Int) { //calculate the seconds since the beggining of the day for comparisions let dateSeconds = hour * 3600 + minute * 60 //set the varibles secondsSinceBeginningOfDay = dateSeconds self.hour = hour self.minute = minute } var hour : Int var minute: Int var date: Date { //get the current calender let calendar = Calendar.current //create a new date components. var dateComponents = DateComponents() dateComponents.hour = hour dateComponents.minute = minute return calendar.date(byAdding: dateComponents, to: Date())! } /// the number or seconds since the beggining of the day, this is used for comparisions private let secondsSinceBeginningOfDay: Int //comparisions so you can compare times static func == (lhs: Time, rhs: Time) -> Bool { return lhs.secondsSinceBeginningOfDay == rhs.secondsSinceBeginningOfDay } static func < (lhs: Time, rhs: Time) -> Bool { return lhs.secondsSinceBeginningOfDay < rhs.secondsSinceBeginningOfDay } static func <= (lhs: Time, rhs: Time) -> Bool { return lhs.secondsSinceBeginningOfDay <= rhs.secondsSinceBeginningOfDay } static func >= (lhs: Time, rhs: Time) -> Bool { return lhs.secondsSinceBeginningOfDay >= rhs.secondsSinceBeginningOfDay } static func > (lhs: Time, rhs: Time) -> Bool { return lhs.secondsSinceBeginningOfDay > rhs.secondsSinceBeginningOfDay } }
日期扩展以便于访问://添加从日期获取时间的功能:
extension Date { var time: Time { return Time(self) } }
例:
let firstDate = Date() let secondDate = firstDate //Will return true let timeEqual = firstDate.time == secondDate.time
我的方法是用它Calendar
来制作Date
同一天的对象,然后比较它们timeIntervalSinceReferenceDate
.
另一个更干净(但很可能有更多行的结果代码)是为Date
被调用创建扩展secondsFromBeginningOfTheDay() -> TimeInterval
,然后比较得到的double值.
基于第二种方法的示例:
// Creating Date from String let textDate1 = "2017-01-13T12:21:00-0800" let textDate2 = "2016-03-06T20:12:05-0900" let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZ" formatter.timeZone = TimeZone.current return formatter } () // Dates used for the comparison let date1 = dateFormatter.date(from: textDate1) let date2 = dateFormatter.date(from: textDate2) // Date extensions extension Date { func secondsFromBeginningOfTheDay() -> TimeInterval { let calendar = Calendar.current // omitting fractions of seconds for simplicity let dateComponents = calendar.dateComponents([.hour, .minute, .second], from: self) let dateSeconds = dateComponents.hour! * 3600 + dateComponents.minute! * 60 + dateComponents.second! return TimeInterval(dateSeconds) } // Interval between two times of the day in seconds func timeOfDayInterval(toDate date: Date) -> TimeInterval { let date1Seconds = self.secondsFromBeginningOfTheDay() let date2Seconds = date.secondsFromBeginningOfTheDay() return date2Seconds - date1Seconds } } if let date1 = date1, let date2 = date2 { let diff = date1.timeOfDayInterval(toDate: date2) // as text if diff > 0 { print("Time of the day in the second date is greater") } else if diff < 0 { print("Time of the day in the first date is greater") } else { print("Times of the day in both dates are equal") } // show interval as as H M S let timeIntervalFormatter = DateComponentsFormatter() timeIntervalFormatter.unitsStyle = .abbreviated timeIntervalFormatter.allowedUnits = [.hour, .minute, .second] print("Difference between times since midnight is", timeIntervalFormatter.string(from: diff) ?? "n/a") } // Output: // Time of the day in the second date is greater // Difference between times since midnight is 8h 51m 5s
我在执行此操作时遇到问题,如果您只想比较两个日期的时间,我想我找到了一个更简单的解决方案。确实感觉有些“ hacky”,但效果很好。
SWIFT 4
// date1 and date2 are the dates you want to compare let calendar = Calendar.current var newDate = Date(TimeIntervalSinceReferenceDate: 0) // Initiates date at 2001-01-01 00:00:00 +0000 var newDate1 = Date(TimeIntervalSinceReferenceDate: 0) // Same as above // Recieving the components from the dates you want to compare let newDateComponents = calendar.dateComponents([.hour, .minute], from: date1)! let newDate1Components = calendar.dateComponents([.hour, .minute], from: date2)! // Adding those components newDate = calendar.date(byAdding: newDateComponents, to: newDate) newDate1 = calendar.date(byAdding: newDate1Components, to: newDate1)