How do you compare just the time of a Date in Swift?

后端 未结 8 948
挽巷
挽巷 2020-12-29 10:05

I have two Date Objects:

  1. 2017-01-13 11:40:17 +0000

  2. 2016-03-15 10:22:14 +0000

I need to compare

8条回答
  •  無奈伤痛
    2020-12-29 10:47

    My approach would be to use Calendar to make them Date objects with the same day and then comparing them using for example timeIntervalSinceReferenceDate.

    Another, cleaner (but most likely with more lines of resulting code) would be to create extension for Date called secondsFromBeginningOfTheDay() -> TimeInterval and then comparing the resulting double values.

    Example based on the second approach:

    // 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
    

提交回复
热议问题