Swift自定义Date扩展时间格式化无效 如何正确调用修改
iOS智能时间显示功能修复方案
正确的Date扩展实现
首先确保扩展逻辑符合需求,可直接复用以下可运行代码:
import Foundation extension Date { /// 传入秒级时间戳,返回格式化后的智能时间字符串 static func timeString(timeInterval: TimeInterval) -> String { let targetDate = Date(timeIntervalSince1970: timeInterval) let calendar = Calendar.current let formatter = DateFormatter() formatter.locale = Locale(identifier: "zh_CN") // 当日时间 if calendar.isDateInToday(targetDate) { formatter.dateFormat = "今天 HH:mm" return formatter.string(from: targetDate) } // 昨日时间 if calendar.isDateInYesterday(targetDate) { formatter.dateFormat = "昨天 HH:mm" return formatter.string(from: targetDate) } // 近7天内非今昨时间,显示周几 let dayDiff = calendar.dateComponents([.day], from: targetDate, to: Date()).day ?? 0 if dayDiff < 7 { formatter.dateFormat = "EEEE HH:mm" return formatter.string(from: targetDate) } // 更早时间显示标准格式 formatter.dateFormat = "yyyy-MM-dd HH:mm" return formatter.string(from: targetDate) } /// 实例方法版本,基于Date实例直接调用,适配现有存Date模型的逻辑 func smartDisplayText() -> String { return Date.timeString(timeInterval: self.timeIntervalSince1970) } }
原有代码修改方式
原有getDatas方法逻辑不需要改动,正常将时间戳转Date存入Post模型即可,只需要修改cellForRowAt里的时间赋值逻辑:
- 删除原来在代理方法里初始化
DateFormatter、写死"yyyy/MM/dd HH:mm"格式的冗余代码 - 按扩展的方法类型正确调用即可,参考代码如下:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! PostCell let post = postList[indexPath.row] // 调用方式1:静态方法调用 // cell.timeLabel.text = Date.timeString(timeInterval: post.createTime.timeIntervalSince1970) // 调用方式2:实例方法调用(更简洁) cell.timeLabel.text = post.createTime.smartDisplayText() // 其余cell属性赋值逻辑保持不变 return cell }
功能不生效常见排查点
- 确认时间戳类型:如果接口返回的是13位毫秒级时间戳,传入方法前要先除以1000转成秒级,否则时间计算会完全错误
- 确认访问权限:如果扩展写在其他独立模块中,需要给扩展方法加上
public修饰符,否则当前业务模块无法调用 - 不要手动用
86400*7这类固定秒数计算日期差,必须用Calendar提供的系统日期判断方法,避免时区、夏令时导致的判断偏差 - 必须给
DateFormatter设置zh_CN的本地化标识,否则周几会显示为英文
内容的提问来源于stack exchange,提问作者AIOPEN
相关产品推荐
相关产品推荐

