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

Swift如何从带AM/PM的日期中提取时间 格式化返回错误如何解决

代码核心问题

  • 格式符搭配错误:HH代表24小时制的小时,和代表上下午标识的aa不能同时使用,解析带AM/PM的12小时制时间时,小时对应的格式符应该是h(1-12)或者hh(01-12)。你原代码中输入输出格式都用了HH:mm aa的错误搭配,直接导致日期解析结果异常,输出的错误时间就是解析失败后的异常值。
  • 缺少显式的地区与时区配置:DateFormatter默认继承设备当前的地区、时区设置,如果设备地区不是英语区,会无法正确识别AM/PM标识,也可能出现时区偏移导致的时间错误。
  • 强制解包存在崩溃风险:你用!强制解包date的结果,如果输入的字符串格式不匹配,会直接触发崩溃。

修正后代码

func changeFormat(str: String) -> String {
    let dateFormatter = DateFormatter()
    // 显式指定固定英语地区,保证能正确识别AM/PM标识
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    // 如果输入时间是指定时区可额外配置,默认用设备本地时区可省略
    // dateFormatter.timeZone = TimeZone(identifier: "UTC")
    // 输入格式改用12小时制对应的h格式符
    dateFormatter.dateFormat = "MM/dd/yyyy h:mm aa"
    
    let newDateFormatter = DateFormatter()
    newDateFormatter.locale = Locale(identifier: "en_US_POSIX")
    // 输出格式如果要12小时制带AM/PM保留h:mm aa,要24小时制可改为HH:mm并去掉aa
    newDateFormatter.dateFormat = "h:mm aa"
    
    // 避免强制解包,解析失败返回空字符串或自定义默认值
    guard let date = dateFormatter.date(from: str) else {
        return ""
    }
    return newDateFormatter.string(from: date)
}

原调用逻辑无需修改,输入06/22/2021 2:00 PM可正确输出2:00 PM。

内容的提问来源于stack exchange,提问作者iPhone 7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:06:09