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

求Swift模糊时间差计算函数的优化实现方案

优化Swift模糊时间差计算的方案

你的需求是生成单一单位的模糊时间描述,原代码思路没问题,但可以通过利用系统Calendar API和简化分支逻辑变得更简洁准确,同时解决硬编码时间常量带来的精度问题(比如不同月份天数不同、闰年等情况)。

核心优化点

  • 替换硬编码秒数:用Calendar计算时间分量,避免年、月天数不准的问题
  • 简化分支逻辑:通过优先级数组遍历,替代冗长的if-else链
  • 优雅处理单复数:集中处理单复数规则,减少重复代码

优化后的代码

extension Date {
    func fuzzyDistanceToNow(includeJustNow: Bool, appendString: String = "") -> String {
        let now = Date()
        let components = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self, to: now)
        
        // 按优先级定义时间单位及对应名称
        let timeUnits: [(component: Int?, singular: String, plural: String)] = [
            (components.year, "year", "years"),
            (components.month, "month", "months"),
            (components.day, "day", "days"),
            (components.hour, "hour", "hours"),
            (components.minute, "minute", "minutes")
        ]
        
        // 遍历找到第一个非零的时间单位
        for (value, singular, plural) in timeUnits {
            guard let count = value, count > 0 else { continue }
            
            let timeString = count == 1 ? singular : "\(count) \(plural)"
            var result = timeString
            if !appendString.isEmpty && result != "just now" {
                result += appendString
            }
            return result
        }
        
        // 处理小于1分钟的情况
        return includeJustNow ? "just now" + (appendString.isEmpty ? "" : appendString) : ""
    }
}

进阶优化(支持本地化)

如果需要适配多语言,把单复数处理换成系统本地化方法更专业:

// 替换上述代码中的timeString生成逻辑
let timeString = String.localizedStringWithFormat("%@ %@", 
                                                  String(count),
                                                  count == 1 ? singular : plural)

优化优势

  • 精度更高:Calendar自动处理闰年、不同月份天数等特殊情况,不会出现硬编码秒数的误差
  • 代码更简洁:用数组遍历替代10+个if-else分支,逻辑清晰,后续新增单位只需修改数组
  • 扩展性强:调整单位优先级、新增秒级判断都只需改动少量代码
  • 维护性好:单复数逻辑集中处理,避免重复拼接字符串的冗余代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:05:55