iOS DateFormatter:如何以最简方式格式化时间?
优化12小时制下无分钟时间的格式化方案
以下是几种比你当前字符串替换更简洁可靠的实现方式:
方法一:根据分钟数动态选择格式化规则
直接判断时间的分钟是否为0,对应使用不同的本地化格式模板,完全避免字符串替换:
let dateFormatter = DateFormatter() let calendar = Calendar.current let minutes = calendar.component(.minute, from: date) if minutes == 0 { // 无分钟时使用仅包含小时和AM/PM的本地化格式 dateFormatter.setLocalizedDateFormatFromTemplate("h a") } else { // 有分钟时沿用short样式 dateFormatter.timeStyle = .short } let formattedTime = dateFormatter.string(from: date)
这种方式适配所有地区的本地化规则(比如部分地区AM/PM前有空格,部分没有),不会出现字符串替换漏判的情况。
方法二:正则表达式简化替换
如果不想额外判断分钟数,用正则表达式一次性处理所有":00"后缀的情况:
let dateFormatter = DateFormatter() dateFormatter.timeStyle = .short let formattedTime = dateFormatter.string(from: date) .replacingOccurrences(of: ":00\\s*(?=[AaPp][Mm])", with: "", options: .regularExpression)
正则表达式会匹配所有":00"后跟AM/PM的场景(忽略大小写、支持中间有无空格),一次替换完成所有处理,大幅减少冗余代码。
方法三:自定义固定格式(仅适用于特定场景)
如果不需要适配多地区本地化,也可以直接指定固定格式,但灵活性较差:
let dateFormatter = DateFormatter() let calendar = Calendar.current let minutes = calendar.component(.minute, from: date) dateFormatter.dateFormat = minutes == 0 ? "h a" : "h:mm a" let formattedTime = dateFormatter.string(from: date)
内容的提问来源于stack exchange,提问作者Oliver Pearmain
相关产品推荐
相关产品推荐

