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
相关产品推荐
相关产品推荐

