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

如何在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)
  • .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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:33:34