首页 > 解决方案 > 如何快速计算跨越两天的两次之间的正确时间间隔?

问题描述

我试图获得跨越两天(过夜)的两次之间的正确时间间隔。这是我的代码成功打印出两次之间的差异-但是对于我的用例,我需要能够跨越一夜,我该怎么做?

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm"

    //This time represents (23:00, Aug 07) for example
    let date1 = dateFormatter.date(from: "23:00")!

    //This time represents (06:00, Aug 08) for example
    let date2 = dateFormatter.date(from: "06:00")!

    let elapsedTime = date2.timeIntervalSince(date1)
    print(abs(elapsedTime)/60/60)

    //prints 17.0 

我想要的结果是打印出 7,因为这是 8 月 7 日 23:00 和 8 月 8 日 06:00 之间的小时数 - 我当前的代码正确地向我显示了这两次之间的间隔(好像他们是从同一天开始),但我正在努力解决这些时间重叠两天的情况。任何帮助将非常感激。

更新:

为了提供更完整的图片,我有一个对象,它的开始和结束日期由字符串表示:

Activity(startTime: "23:00", endTime:  "06:00")

我使用一些函数将这些字符串转换为日期:

func startDate(startTime: String) -> Date {
    let currentDate = Date().string(format: "dd-MM-yyyy")
    let myStartingDate = "\(currentDate) \(startTime)"
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
    let startDate = dateFormatter.date(from: myStartingDate)

    return startDate!
}

func endDate(endTime: String) -> Date {
    let currentDate = Date().string(format: "dd-MM-yyyy")
    let myEndingDate = "\(currentDate) \(endTime)"
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
    let endDate = dateFormatter.date(from: myEndingDate)

    return endDate!
}

所以我更完整的作品看起来更像这样:

func calculateTimeInterval(activity: Activity) {

let startHourDate = self.startDate(startTime: activity.startTime)
let endHourDate = self.endDate(endTime: activity.endTime)

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"

//This time represents (23:00, Aug 07) for example
let date1 = startHourDate!

//This time represents (06:00, Aug 08) for example
let date2 = endHourDate!

let elapsedTime = date2.timeIntervalSince(date1)
print(abs(elapsedTime)/60/60)

}

//prints 17.0 

标签: swiftdatecalendar

解决方案


您可以像这样编写扩展至日期:

extension Date {
    func hours(from date: Date) -> Int {
        return Calendar.current.dateComponents([.hour], from: date).hour ?? 0
    }
}

直接在任何日期使用它。这样你根本不需要 DateFormatter 。希望这可以帮助!


推荐阅读