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

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 ᵀᴹ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:47:41