Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在swift中计算跨越两天的两次之间的正确时间间隔?_Swift_Date_Calendar - Fatal编程技术网

如何在swift中计算跨越两天的两次之间的正确时间间隔?

如何在swift中计算跨越两天的两次之间的正确时间间隔?,swift,date,calendar,Swift,Date,Calendar,我正在尝试获得两次之间的正确时间间隔,这两次跨越两天(一夜)。下面是我的代码,它成功地打印出了两次之间的差异——但是对于我的用例,我需要能够跨越一夜,我该如何做到这一点呢 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "HH:mm" //This time represents (23:00, Aug 07) for example let date1 = dateFormatter

我正在尝试获得两次之间的正确时间间隔,这两次跨越两天(一夜)。下面是我的代码,它成功地打印出了两次之间的差异——但是对于我的用例,我需要能够跨越一夜,我该如何做到这一点呢

    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
    }
}

您可以编写一个扩展名,如下所示:

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。希望这有帮助

您可以编写一个扩展名,如下所示:

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)
var elapsedTime=date2.timeIntervalSince(date1)
如果elapsedTime<0{
设date3=date2+60*60*24
elapsedTime=date3.时间间隔(date1)
}
打印(elapsedTime/60/60)

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

var elapsedTime = date2.timeIntervalSince(date1)
if elapsedTime < 0 { 
    let date3 = date2 + 60 * 60 * 24
    elapsedTime = date3.timeIntervalSince(date1)
}
print(elapsedTime/60/60)
var elapsedTime=date2.timeIntervalSince(date1)
如果elapsedTime<0{
设date3=date2+60*60*24
elapsedTime=date3.时间间隔(date1)
}
打印(elapsedTime/60/60)

在你的应用程序中,你如何知道它们是在不同的日子?你的例子只显示了2次。你应该有
日期
。谢谢你的评论,我添加了一些可能有用的信息,我认为问题是,正如瓦卡瓦马所回避的那样,我没有在特定的日期烘焙-我是新来使用日期的,所以如果有人能给我正确的方向,那就太好了!第二天从“23:00”到“06:00”的时间间隔“通常”为7小时,但如果时钟调整为夏令时,也可以为6或8小时。因此,如果没有其他信息,问题就不清楚了。开始日期总是在当天吗?是的,开始日期总是在当天。在你的应用程序中,你怎么知道它们是在不同的日期?你的例子只显示了2次。你应该有
日期
。谢谢你的评论,我添加了一些可能有用的信息,我认为问题是,正如瓦卡瓦马所回避的那样,我没有在特定的日期烘焙-我是新来使用日期的,所以如果有人能给我正确的方向,那就太好了!第二天从“23:00”到“06:00”的时间间隔“通常”为7小时,但如果时钟调整为夏令时,也可以为6或8小时。因此,如果没有其他信息,问题就不清楚了。开始日期总是在当天吗?是的,开始日期总是在当天。谢谢你的帮助-这看起来像是一个有用的扩展,当我可以将日期写入我的对象时,它会派上用场!感谢您的帮助-这看起来确实是一个有用的扩展,当我可以将日期写入我的对象时,它会派上用场!嘿,谢谢你的帮助-这个计算在我的情况下有效(仅使用字符串时)。非常感谢!嘿,谢谢你的帮助-这个计算在我的情况下有效(仅使用字符串时)。非常感谢!