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

