【问题标题】:How to calculate the correct time interval between two times that span two days in swift?如何快速计算跨越两天的两次之间的正确时间间隔?
【发布时间】:2019-08-27 09:57:43
【问题描述】:

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

    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 

【问题讨论】:

  • 在您的应用中,您如何知道他们在不同的日子?您的示例仅显示 2 次。
  • 你也应该有date
  • 感谢您的 cmets,我添加了一些可能有帮助的更多信息,我认为问题,正如 vacawama 所逃避的那样,是我没有在特定日期烘烤 - 我是刚开始使用 Dates,所以如果有人能把我送到正确的方向,那就太好了!
  • 从“23:00”到第二天“06:00”的时间间隔“通常”是7小时,但如果时钟调整为夏令时,也可以是6小时或8小时时间。因此,如果没有额外的信息,这个问题就不清楚了。开始日期总是在当前天吗?
  • 是的,开始日期总是在当天。

标签: swift date calendar


【解决方案1】:

如果没有日期部分,确定结束时间是否超过午夜的唯一方法是结束时间是否小于开始时间。如果是这样,您的代码可以更改为

var elapsedTime = date2.timeIntervalSince(date1)
if elapsedTime < 0 { 
    let date3 = date2 + 60 * 60 * 24
    elapsedTime = date3.timeIntervalSince(date1)
}
print(elapsedTime/60/60)

【讨论】:

  • 嘿,感谢您的帮助 - 这个计算适用于我的情况(仅使用字符串时)非常感谢!
【解决方案2】:

你可以像这样写一个日期扩展:

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

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

【讨论】:

  • 感谢您的帮助 - 这看起来确实是一个有用的扩展,当我可以将日期写入我的对象时会派上用场!
猜你喜欢
  • 2021-08-23
  • 2022-06-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2012-04-01
相关资源
最近更新 更多