如何从格式化的时间字符串值中获取时间差

how to get time difference form formatted time string values

你好如何获取两个字符串值的时间差

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
}

预期的结果是08.50,但对我来说却是8.0

您只需要获取分钟而不是小时并将其除以 60。顺便说一下,您还应该将 dateFormatter 的默认日期设置为今天:

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

您要求的是小时差。日历函数 dateComponents(_:from:to:) 将为您提供日期之间的整小时数(如果您需要的话)。如果不询问分钟数,则会被截断。

如果您想要小时和整分钟,您可以要求小时和分钟,然后做一些数学运算将它们结合起来,或者按照 Leo 的建议只要求分钟,然后将分钟除以 60。

您也可以使用 endDate.timeIntervalSinceReferenceDate-startDate.timeIntervalSinceReferenceDate)/3600.0。这将为您提供一个 Double 表示两个日期之间的确切小时数,包括秒和秒的分数。 (不相关,因为您的源日期仅指定小时和分钟,但在其他情况下可能会有用。)