Swift 5中如何为字符串格式日期添加指定时长且适配跨天场景
实现代码
你可以直接在原有函数上新增addHours参数,内部通过Calendar处理时长追加,自动适配跨天、跨月等边界场景,同时优化了原有代码的强制解包风险:
import Foundation func localToUTC(date: String, originTimeZone: String, addHours: Double = 0) -> String? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MM/dd/yyyy HH:mm" dateFormatter.timeZone = TimeZone(identifier: originTimeZone) // 安全解包输入的时间字符串 guard let localDate = dateFormatter.date(from: date) else { return nil } // 用Calendar追加指定时长,自动处理跨天等场景 let calendar = Calendar(identifier: .gregorian) let totalMinutes = Int(addHours * 60) guard let targetDate = calendar.date(byAdding: .minute, value: totalMinutes, to: localDate) else { return nil } // 转换为UTC格式字符串输出 dateFormatter.timeZone = TimeZone(abbreviation: "UTC") return dateFormatter.string(from: targetDate) } // 测试你的航班场景 if let result = localToUTC(date: "05/01/2021 15:37", originTimeZone: "America/Boise", addHours: 4) { print(result) // 输出:05/02/2021 01:37,符合预期 } // 测试1.5小时的场景 if let result2 = localToUTC(date: "05/01/2021 15:37", originTimeZone: "America/Boise", addHours: 1.5) { print(result2) // 输出:05/01/2021 23:07 }
说明
- 新增的
addHours参数默认值为0,不传的话和原有函数功能完全一致,兼容旧代码调用 - 把小时数转换为分钟数追加,天然支持小数小时(比如1.5小时对应90分钟),不需要单独拆分时分计算
- 用公历
Calendar(identifier: .gregorian)计算时间偏移,比直接加timeInterval更稳定,不会出现夏令时、闰年、跨月等场景的计算误差 - 所有可选值都做了安全校验,避免传入非法时间字符串、时区标识时的崩溃问题
如果你不想修改原有函数,也可以单独封装一个UTC时间追加时长的工具函数:
func addHoursToUTCDate(utcDateStr: String, addHours: Double) -> String? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MM/dd/yyyy HH:mm" dateFormatter.timeZone = TimeZone(abbreviation: "UTC") guard let utcDate = dateFormatter.date(from: utcDateStr) else { return nil } let calendar = Calendar(identifier: .gregorian) let totalMinutes = Int(addHours * 60) guard let targetDate = calendar.date(byAdding: .minute, value: totalMinutes, to: utcDate) else { return nil } return dateFormatter.string(from: targetDate) } // 调用示例 let utcTakeoffTime = localToUTC(date: "05/01/2021 15:37", originTimeZone: "America/Boise")! let arrivalTime = addHoursToUTCDate(utcDateStr: utcTakeoffTime, addHours: 4)
内容的提问来源于stack exchange,提问作者f1racer328
相关产品推荐
相关产品推荐

