如何计算swift中跨越两天的两次时间之间的正确时间间隔?
How to calculate the correct time interval between two times that span two days in 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 。希望这对您有所帮助!
如果没有日期部分,确定结束时间是否超过午夜的唯一方法是结束时间是否小于开始时间。如果是这样,您的代码可以更改为
var elapsedTime = date2.timeIntervalSince(date1)
if elapsedTime < 0 {
let date3 = date2 + 60 * 60 * 24
elapsedTime = date3.timeIntervalSince(date1)
}
print(elapsedTime/60/60)
我正在尝试获取跨越两天(隔夜)的两次之间的正确时间间隔。这是我的代码成功打印出两次之间的差异 - 但是对于我的用例,我需要跨越一夜的能力,我该怎么做?
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 。希望这对您有所帮助!
如果没有日期部分,确定结束时间是否超过午夜的唯一方法是结束时间是否小于开始时间。如果是这样,您的代码可以更改为
var elapsedTime = date2.timeIntervalSince(date1)
if elapsedTime < 0 {
let date3 = date2 + 60 * 60 * 24
elapsedTime = date3.timeIntervalSince(date1)
}
print(elapsedTime/60/60)