如何在Swift扩展中实现日期与当前时间差计算及友好展示
实现日期相对时间显示方案
需求说明
将API获取的JSON日期字符串转为Date类型后,计算该日期与当前日期的时间差:
- 时间差小于24小时时,显示「n小时前」
- 时间差≥24小时时,显示「n天前」
实现步骤
1. 扩展Date类,添加相对时间计算方法
在现有Date扩展中新增方法,直接返回格式化后的相对时间字符串:
extension Date { // 保留原有方法 func toString(withFormat format: String = "MM.dd") -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = format return dateFormatter.string(from: self) } func toStringCoin(withFormat format: String = "HH") -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = format return dateFormatter.string(from: self) } // 新增:计算与当前时间的相对差 func relativeTimeString() -> String { let currentDate = Date() let timeInterval = currentDate.timeIntervalSince(self) let hours = Int(timeInterval / 3600) if hours < 24 { return "\(hours)小时前" } else { let days = hours / 24 return "\(days)天前" } } }
2. 确保日期字符串正确转换为Date
根据API返回的日期格式,调用对应的String扩展方法完成转换:
// 示例:如果API返回格式是"MM/dd/yyyy HH:mm" guard let newsDate = newsModel.date.toDateCoin() else { // 处理转换失败的情况,比如返回默认文本 return Text("未知时间") }
3. 修改调用代码,直接使用相对时间
替换原有调用逻辑,直接调用新增的relativeTimeString()方法:
// 当newsDate是Date类型时 Text(newsDate.relativeTimeString()) // 可选:如果想直接从字符串一步获取相对时间,扩展String类 extension String { func toDate(withFormat format: String = "MM/dd/yyyy")-> Date?{ let dateFormatter = DateFormatter() dateFormatter.dateFormat = format return dateFormatter.date(from: self) } func toDateCoin(withFormat format: String = "MM/dd/yyyy HH:mm")-> Date?{ let dateFormatter = DateFormatter() dateFormatter.dateFormat = format return dateFormatter.date(from: self) } // 新增:直接从日期字符串获取相对时间 func relativeTimeString(withFormat format: String = "MM/dd/yyyy HH:mm") -> String { guard let date = self.toDateCoin(withFormat: format) else { return "未知时间" } return date.relativeTimeString() } } // 此时调用方式更简洁: Text(newsModel.date.relativeTimeString())
注意事项
- 时区适配:如果API返回的是UTC时间,需要给
DateFormatter设置timeZone = TimeZone(identifier: "UTC"),避免时间转换偏差 - 边界优化:如果时间差小于1小时,当前逻辑会显示「0小时前」,可根据需求修改为「刚刚」等友好提示
内容的提问来源于stack exchange,提问作者Oleksandr
相关产品推荐
相关产品推荐

