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

Swift中24小时制转12小时制失效问题排查

Swift 24小时制转12小时制问题修复

你的代码存在几个关键问题:

  • 完全没必要把传入的Date转成字符串再重新解析,这是多此一举,而且"\(date)"的输出格式不一定和你设置的dateFormatter.dateFormat完全匹配,会导致解析失败或者时间偏移。
  • 没有设置DateFormatter的locale,会导致a(上午/下午标识)无法正常显示,这也是你输出只有时间没有AM/PM的原因。
  • 使用date1!强制解包,一旦解析失败会直接崩溃,非常不安全。
  • 未明确设置时区,默认时区是设备本地时区,会导致转换后的时间和原UTC时间出现偏差。

修正后的代码:

func getDate(date: Date) -> String {
    let dateFormatter = DateFormatter()
    // 设置locale,确保上午/下午标识正常显示
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    // 设置时区为UTC,和原时间的时区一致
    dateFormatter.timeZone = TimeZone(identifier: "UTC")
    // 直接设置目标格式:12小时制+上午/下午
    dateFormatter.dateFormat = "h:mm a"
    
    let date12 = dateFormatter.string(from: date)
    print("12 hour formatted Date:", date12)
    return date12
}

代码说明:

  • 直接使用传入的Date对象进行格式化,省去多余的字符串转换和解析步骤,既高效又避免格式不匹配问题。
  • 设置locale为en_US_POSIX,保证a能正确输出AM或PM;如果需要中文的“上午/下午”,可以把locale改成zh_CN。
  • 设置时区为UTC,和你原时间的+0000时区一致,避免时间偏移。
  • 去掉了不安全的强制解包,因为直接用原始Date对象格式化不会返回nil。

测试时传入2023-07-17 15:13:00 +0000这个Date,输出会是3:13 PM,完美实现24小时转12小时制的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:04:55