Swift倒计时秒数格式化异常:60秒显示00.9而非60.9的问题
问题原因分析
你遇到的问题根源在于使用DateFormatter的ss.S格式。当倒计时剩余60.x秒时,代码计算出minutes=1,构造的Date对象对应参考时间后1分钟加x毫秒,此时DateFormatter的ss字段会提取该时间点的秒数部分(即00),而非剩余的总秒数,因此出现00.9这类错误格式。
解决方案:直接计算格式化,避免DateFormatter
不需要借助DateFormatter,直接对剩余秒数的整数部分和毫秒部分进行计算拼接,就能精准得到你想要的格式:
extension RaceTimeFormatterService { /// 格式化倒计时为 X.X 形式(如60.9、59.8等) func formatForMsTimeElapsed(totalSeconds: Double) -> String { // 确保数值非负(倒计时不会出现负数) let clampedSeconds = max(totalSeconds, 0) // 提取整数秒部分 let integerSeconds = floor(clampedSeconds) // 提取一位毫秒数(0-9) let millisecondDigit = Int((clampedSeconds - integerSeconds) * 10) // 拼接成目标格式 return "\(Int(integerSeconds)).\(millisecondDigit)" } }
代码说明
clampedSeconds:确保倒计时不会出现负数,避免异常格式。integerSeconds:取剩余秒数的整数部分(如60.9的整数部分是60)。millisecondDigit:计算小数部分乘以10后的整数,得到一位毫秒数字(如60.9的小数部分0.9×10=9)。- 直接拼接字符串,完全按照剩余秒数的实际值展示,不会出现
DateFormatter带来的时间点转换误差。
验证场景
- 当
totalSeconds=60.9时,输出60.9 - 当
totalSeconds=59.1时,输出59.1 - 当
totalSeconds=0.5时,输出0.5
内容的提问来源于stack exchange,提问作者Wo_0NDeR ᵀᴹ
相关产品推荐
相关产品推荐

