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

Swift中如何将字符串中的时间格式转换为TimeInterval?

提取字符串中的时长并转换为TimeInterval(Swift)

我有一个包含时长信息的字符串数组,示例代码如下:

let arrayOfStrings: [String] = ["Episode 1 - 23 min", "Episode 2 - 42 min", "Episode 3 - 45 min"] 

func convertToTimeInterval(from string: String) -> TimeInterval {
    // 逻辑代码...
    return timeInterval // Double类型
}

期望调用后得到以下输出:

arrayOfStrings.forEach { string in 
   print(convertToTimeInterval(from: string))
}

// 输出结果
1380 // 来自"23 min"的timeinterval
2520 // 来自"42 min"的timeinterval
2700 // 来自"45 min"的timeinterval

遇到的问题

  • 按'min'字符分割无法支持多语言场景,不同语言的时长单位文本不同,无法提前确定分割字符
  • 使用CharacterSet.separatedBy分割时,会误提取字符串中无关的数字(比如"Episode 1"里的1)

解决方案

利用NSDataDetector可以高效解决这个问题,它能自动识别多语言环境下的时长信息,准确提取有效时长数值:

import Foundation

let arrayOfStrings: [String] = ["Episode 1 - 23 min", "Episode 2 - 42 min", "Episode 3 - 45 min"] 

func convertToTimeInterval(from string: String) -> TimeInterval {
    // 创建日期类型的检测器
    guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue) else {
        return 0
    }
    
    // 检测字符串中的时间相关内容
    let matches = detector.matches(in: string, range: NSRange(string.startIndex..., in: string))
    
    for match in matches {
        // 提取匹配到的日期组件
        if let dateComponents = match.dateComponents {
            // 取出分钟数并转换为秒级TimeInterval
            if let minutes = dateComponents.minute {
                return TimeInterval(minutes * 60)
            }
        }
    }
    
    // 未匹配到时长时返回0
    return 0
}

// 测试输出
arrayOfStrings.forEach { string in 
   print(convertToTimeInterval(from: string))
}

方案优势

  • 无需硬编码时长单位(如"min"、"分钟"等),自动适配多语言场景
  • 仅识别有效的时长数字,不会误提取无关的数字内容

内容的提问来源于stack exchange,提问作者Manny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:45:32