如何在Swift 5中为字符串date添加指定的持续时间



所以我有一个函数将指定的本地时间转换为UTC(时间以字符串开始和结束)

我需要为这个时间添加一个持续时间(比如1.5小时),这可能会持续到第二天,所以我认为我需要使用Calendar,而不是timeInterval。

我对如何做到这一点有点无能为力,文档在这方面不是最好的,我不擅长Swift。

这是我到目前为止写的。

import Foundation

func localToUTC(date:String, originTimeZone:String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm"
dateFormatter.timeZone = TimeZone(identifier: originTimeZone)

let dt = dateFormatter.date(from: date)
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm"

return dateFormatter.string(from: dt!)
}
print(localToUTC(date: "05/01/2021 15:37", originTimeZone: "America/Boise"))

只是为了清楚,我正试图添加另一个参数到我的函数(或创建一个新函数,无关紧要),以添加持续时间到UTC时间,我当前的函数输出。

把事情放在上下文中,假设一架航班在当地时间15:37起飞(例如,博伊西,这是UTC转换的+6)。

所以航班在2021年5月1日21:37 UTC起飞。飞行时间4小时。

我想输出5/2/2021 01:37 UTC。

只需将飞行持续时间添加到生成的日期对象中。还要注意,你不应该强制展开结果,因为它可能会导致应用程序崩溃。确保在传递无效字符串时返回nil。比如:

func localToUTC(date: String, originTimeZone: String, duration: TimeInterval) -> String? {
let dateFormatter = DateFormatter()
dateFormatter.locale = .init(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm"
guard let timezone = TimeZone(identifier: originTimeZone) else { return nil }
dateFormatter.timeZone = timezone
guard let dt = dateFormatter.date(from: date) else { return nil }
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
return dateFormatter.string(from: dt.addingTimeInterval(duration))
}

print(localToUTC(date: "05/01/2021 15:37", originTimeZone: "America/Boise", duration: 4 * 60 * 60) ?? "nil")

打印

05/02/2021 01:37