如何在Swift中使用Duration.TimeFormatStyle实现h m s格式时间格式化
使用Duration.TimeFormatStyle实现自定义时/分/秒格式
你可以通过自定义Duration.TimeFormatStyle的配置,完全复现原TimeInterval扩展的格式逻辑,同时遵循Apple的API最佳实践。以下是具体实现方案:
1. 给TimeInterval添加便捷转Duration的扩展
为了更方便地将TimeInterval转换为Apple推荐的Duration类型,添加一个简单扩展:
extension TimeInterval { var duration: Duration { Duration.seconds(self) } // 保留原初始化方法(可选,方便创建测试用例) init(hours: Int, minutes: Int, seconds: Int) { self = Double(hours * 3600 + minutes * 60 + seconds) } }
2. 定义符合需求的自定义格式样式
通过配置Duration.TimeFormatStyle的参数,完全匹配原toString()方法的逻辑:
let customTimeStyle: Duration.TimeFormatStyle = .init() .hour(.defaultDigits) .minute(.defaultDigits) .second(.defaultDigits) .locale(Locale(identifier: "en_US_POSIX")) // 固定使用h/m/s缩写,不受系统语言影响 .combinedStyle(.conditional) // 核心:只显示必要的最高量级单位及相邻单位 .unitStyle(.abbreviated) // 使用单位缩写(h/m/s) .separator(" ") // 单位之间用空格分隔
3. 样式参数说明
这个配置完全对应你原有的格式规则:
.combinedStyle(.conditional):自动根据时长长度判断显示哪些单位:- 时长≥1小时:仅显示小时 + 分钟(如5小时33分15秒 →
5h 33m) - 时长<1小时但≥1分钟:仅显示分钟 + 秒(如45分20秒 →
45m 20s) - 时长<1分钟:仅显示秒(如15秒 →
15s)
- 时长≥1小时:仅显示小时 + 分钟(如5小时33分15秒 →
.unitStyle(.abbreviated):指定使用缩写单位(h/m/s),而非全称.locale(...):强制固定locale,避免系统语言切换导致单位符号变化.separator(" "):设置单位之间的空格分隔符,和原格式一致
4. 使用示例
// 测试不同场景 let fiveHours = TimeInterval(hours: 5, minutes: 33, seconds: 15) print(fiveHours.duration.formatted(customTimeStyle)) // 输出:5h 33m let fortyFiveMinutes = TimeInterval(hours: 0, minutes: 45, seconds: 20) print(fortyFiveMinutes.duration.formatted(customTimeStyle)) // 输出:45m 20s let fifteenSeconds = TimeInterval(hours: 0, minutes: 0, seconds: 15) print(fifteenSeconds.duration.formatted(customTimeStyle)) // 输出:15s
内容的提问来源于stack exchange,提问作者Nicolas Gimelli
相关产品推荐
相关产品推荐

