Search code examples
swifttimensdateformatter

how to get time difference form formatted time string values


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


Solution

  • 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