You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:45:03