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

Swift中如何将日期格式化为今日、昨日等替代具体日期的字符串

解决方案

要实现这个需求,我们可以借助Calendar类判断目标日期属于今天、昨天还是明天,再分别处理日期显示逻辑,同时单独提取时间部分格式化,确保显示风格统一。

实现代码

extension Date {
    func stringify() -> String {
        let calendar = Calendar.current
        let now = Date()
        
        // 判断日期归属
        let isToday = calendar.isDateInToday(self)
        let isYesterday = calendar.isDateInYesterday(self)
        let isTomorrow = calendar.isDateInTomorrow(self)
        
        // 格式化时间部分
        let timeFormatter = DateFormatter()
        timeFormatter.timeStyle = .short
        let timeString = timeFormatter.string(from: self)
        
        // 根据日期归属返回对应字符串
        if isToday {
            return "Today at \(timeString)"
        } else if isYesterday {
            return "Yesterday at \(timeString)"
        } else if isTomorrow {
            return "Tomorrow at \(timeString)"
        } else {
            // 非近三天,使用完整日期格式
            let dateFormatter = DateFormatter()
            dateFormatter.dateStyle = .long
            dateFormatter.timeStyle = .short
            return dateFormatter.string(from: self)
        }
    }
}

关键说明

  • Calendar.current提供的isDateInToday/isDateInYesterday/isDateInTomorrow方法,会自动处理时区、夏令时等细节,确保日期判断准确
  • 单独拆分时间格式化逻辑,保证近三天的时间显示和完整日期格式的时间风格一致
  • 保留原有完整日期格式化逻辑,作为非近三天情况的 fallback

如果需要适配多语言,可将固定文本替换为本地化字符串,例如:

return NSLocalizedString("Today", comment: "") + " at \(timeString)"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:45:42