从“结束”时间计算“开始”时间

时间:2019-11-01 15:42:27

标签: swift date time

我正在努力创建一个函数,该函数需要一个输入持续时间和一个“结束”时间,并根据该标准计算“开始”时间。

示例:如果“结束”时间是5:00 pm,并且“持续时间”是30分钟,则返回的“开始”时间应该是4:30 pm。

在Int / Date / String之间进行翻译时,我迷失了方向,所以我可能需要重新考虑整个方法。到目前为止,我正在使用以下方法,这只是对this Stack Overflow post的一种看法:

var userInputEventEndTime: String
var userInputEventDuration: Int
var userInputEventNeedsToStartTime: String

//Manipulate this function with the input parameters
 func makeDate(hr: Int, min: Int, sec: Int) -> Date {
    var calendar = Calendar(identifier: .gregorian)
    let components = DateComponents(hour: hr, minute: min, second: sec)
    let hour = calendar.component(.hour, from: calendar.date(from: components)!)
    let minutes = calendar.component(.minute, from: calendar.date(from: components)!)
    let seconds = calendar.component(.second, from: calendar.date(from: components)!)
    return calendar.date(from: components)!
}

我应该将输入字符串转换为DateComponents然后进行数学运算吗?如果是这样,我不确定如何将几分钟转换为小时。还是只是完全朝着不同的方向前进?谢谢!

2 个答案:

答案 0 :(得分:1)

以下使用DateComponents和Calendar计算开始时间

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"
let calendar = Calendar.current
let dateComponents = DateComponents(calendar: calendar, minute: -userInputEventDuration)

if let endTime = dateFormatter.date(from: userInputEventEndTime),
    let startTime = calendar.date(byAdding: dateComponents, to: endTime, wrappingComponents: false) {
    userInputEventNeedsToStartTime = dateFormatter.string(from: startTime)
}

以下是与函数编写的示例相同的解决方案

func calculateStartTime(from endTime: String, duration: Int) -> String? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "hh:mm a"
    let calendar = Calendar.current

    let dateComponents = DateComponents(calendar: calendar, minute: -duration)
    if let time = dateFormatter.date(from: endTime),
        let startTime = calendar.date(byAdding: dateComponents, to: time, wrappingComponents: false) {
        return dateFormatter.string(from: startTime)
    }

    return nil
}

if let startTime = calculateStartTime(from: "6:00 PM", duration: 30) {
    print("Event starts at \(startTime)")
}

输出

  

活动于05:30 PM开始

答案 1 :(得分:0)

要从日期中减去组成部分,只需添加其负值即可。