Home > other >  how to get time difference form formatted time string values
how to get time difference form formatted time string values

Time:01-22

Hi how to get time difference for two sting value

startTime = "09:00 AM" EndTime = "05:30 PM"

func timeDifferenceBetweenTwoTime(startTime: String, endTime:String) ->CGFloat{
    let start = startTime
    let end = endTime

    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "hh:mm a"

    if let startDate = dateFormatter.date(from: start),
       let endDate = dateFormatter.date(from: end) {
        let hours: CGFloat = CGFloat(Calendar.current.dateComponents([.hour], from: startDate, to: endDate < startDate ? Calendar.current.date(byAdding: .day, value: 1, to: endDate) ?? endDate : endDate).hour ?? 00 )
        return hours
    }
    return 00.00
}

The expected result is 08.50, But for me its giving 8.0

CodePudding user response:

You just need to get the minutes instead of hours and divide it by 60. Btw you should also set your dateFormatter's default date to today:

func timeDifferenceBetweenTwoTime(startTime: String, endTime: String) -> CGFloat {
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.defaultDate = Calendar(identifier: .iso8601).startOfDay(for: Date())
    dateFormatter.dateFormat = "hh:mm a"
    if let startDate = dateFormatter.date(from: startTime),
       var endDate = dateFormatter.date(from: endTime) {
        if startDate > endDate {
            endDate = Calendar.current.date(byAdding: .day, value: 1, to: endDate)!
        }
        let minute = Calendar.current.dateComponents([.minute], from: startDate, to: endDate).minute!
        return CGFloat(minute) / 60
    }
    return 0
}

let startTime = "09:00 AM"
let endTime = "05:30 PM"
timeDifferenceBetweenTwoTime(startTime: startTime, endTime: endTime)  // 8.5

CodePudding user response:

You asked for the difference in hours. The Calendar function dateComponents(_:from:to:) will give you the number of whole hours between your dates if that's what you ask it for. By not also asking for the number of minutes, that gets truncated.

If you want hours and whole minutes you could ask for hours and minutes and do some math to combine them, or just ask for minutes as Leo suggests and divide minutes by 60.

You could also use endDate.timeIntervalSinceReferenceDate-startDate.timeIntervalSinceReferenceDate)/3600.0. That will give you a Double representing the exact number of hours between the two dates, including seconds and fractions of a second. (Not relevant given that your source Dates only specify hours and minutes, but there are other cases where that might be useful.)

  •  Tags:  
  • Related