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

Swift中如何将HH:MM:SS:MS格式时间间隔转为数值存储到Firestore并回读转换

解决方案

核心实现思路

  • 存储侧:将时、分、秒、毫秒全部转换为总毫秒数的整数类型存入Firestore,天然支持数值排序、差值计算等需求,远优于字符串存储方案
  • 读取侧:将读取到的总毫秒数通过简单的数学运算拆分回时、分、秒、毫秒,补前导零后拼接为需要的展示格式即可,无需依赖不支持毫秒的DateComponentsFormatter

1. 输入值转总毫秒数(存储用)

直接替换你原来的字符串拼接逻辑即可,增加了可选值安全校验,避免输入为空时强制解包崩溃:

// 把输入文本转成Int,默认值为0避免空输入崩溃
let hh = Int(goalHHText.text ?? "") ?? 0
let mm = Int(goalMMText.text ?? "") ?? 0
let ss = Int(goalSSText.text ?? "") ?? 0
let ms = Int(goalMSText.text ?? "") ?? 0

// 计算总毫秒数:1小时=3600秒=3,600,000毫秒,1分钟=60秒=60,000毫秒,1秒=1000毫秒
let totalMilliseconds = hh * 3600000 + mm * 60000 + ss * 1000 + ms

// 直接把totalMilliseconds这个Int值存入Firestore即可,不需要存字符串

2. 总毫秒数转回HH:MM:SS:MS格式(展示用)

封装成通用方法,调用就能拿到格式化后的字符串:

func formatMStoTime(_ totalMS: Int) -> String {
    let ms = totalMS % 1000
    let totalSeconds = totalMS / 1000
    let ss = totalSeconds % 60
    let totalMinutes = totalSeconds / 60
    let mm = totalMinutes % 60
    let hh = totalMinutes / 60
    
    // 补前导零,保证时/分/秒都是2位,毫秒固定3位
    return String(format: "%02d:%02d:%02d:%03d", hh, mm, ss, ms)
}

// 调用示例:从Firestore读出来的总毫秒数传入即可得到格式化字符串
let fetchedTotalMS = 27005000
let displayTime = formatMStoTime(fetchedTotalMS)
print(displayTime) // 输出07:30:05:000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:42:02