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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:02:50