如何在 Swift 5 中将指定的持续时间添加到字符串日期

How to add specified duration to string date in Swift 5

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

我需要为这个时间添加一个持续时间(比如说 1.5 小时),这可能会持续到第二天,所以我相信我需要使用日历,而不是 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 的输出。

只需将飞行持续时间添加到生成的日期对象中即可。另请注意,您不应强制解包结果,因为它可能会使您的应用程序崩溃。确保 return 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