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

