swift - 如何快速计算跨越两天的两次之间的正确时间间隔?
问题描述
我试图获得跨越两天(过夜)的两次之间的正确时间间隔。这是我的代码成功打印出两次之间的差异-但是对于我的用例,我需要能够跨越一夜,我该怎么做?
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
解决方案
您可以像这样编写扩展至日期:
extension Date {
func hours(from date: Date) -> Int {
return Calendar.current.dateComponents([.hour], from: date).hour ?? 0
}
}
直接在任何日期使用它。这样你根本不需要 DateFormatter 。希望这可以帮助!
推荐阅读
- laravel - Laravel 5 日期格式值
- r - 重定向函数的文档帮助页面
- javascript - 当字符长度小于特定数字时,jQuery更改html类
- python - 如何杀死以 sudo 启动的 python 子进程?以前的 SO 答案离开僵尸
- bash - 在 bash 中将一个统计/数字与另一个统计/数字分开
- javascript - 如何添加axios代理?
- html - 一个元素没有父元素是什么意思?
- flutter - 如何在 Flutter 中创建全局 TextStyle?
- time - PartiQL 查询中的当前时间
- laravel - 如何从 href 链接传递 vue 数据值或 id 以加载新组件以显示此值或 id?