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
相关产品推荐
相关产品推荐

