Swift开发Int无seconds报错 时间仅Xcode显示无法在模拟器展示
问题根因
时间转换逻辑本身无异常,控制台可正常打印格式化后的时间即可验证这点。标签无法展示正确格式日期的核心原因是赋值逻辑错误:
- 创建
Post模型实例时,仅存储了原始Double类型的时间戳数值,未存储格式化完成的日期字符串 - 给
cell.timeLabel赋值时,直接将原始时间戳强转为字符串,最终标签上展示的是一长串原始时间戳数字,而非目标年月日格式。
修复方案
二选一即可:
方案1:列表赋值时实时格式化时间
直接修改cell的赋值逻辑,替换原有直接转换时间戳的代码:
// 移除原有错误代码 // cell.timeLabel.text = String(postArray[indexPath.row].timestamp) // 替换为格式化逻辑 let targetTimestamp = postArray[indexPath.row].timestamp let date = Date(timeIntervalSince1970: targetTimestamp) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy/MM/dd HH:mm" // 若时间和北京时间差8小时,解开下一行注释 // dateFormatter.timeZone = TimeZone(identifier: "Asia/Shanghai") cell.timeLabel.text = dateFormatter.string(from: date)
性能提示:
DateFormatter创建开销较高,不要在cellForRowAt方法内反复创建实例,可以将其定义为静态属性全局复用,避免列表滚动时频繁创建对象引发卡顿。
方案2:模型初始化时提前完成格式化
修改Post结构体,新增存储格式化后时间字符串的属性,初始化模型时就完成时间转换,赋值时直接调用即可:
- 调整Post结构体代码:
struct Post { var email: String var caption: String var imageUrl: String var timestamp: Double var formattedTime: String init(email: String, caption: String, imageUrl: String, timestamp: Double) { self.email = email self.caption = caption self.imageUrl = imageUrl self.timestamp = timestamp // 初始化阶段完成时间格式化 let date = Date(timeIntervalSince1970: timestamp) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy/MM/dd HH:mm" // 若时间和北京时间差8小时,解开下一行注释 // dateFormatter.timeZone = TimeZone(identifier: "Asia/Shanghai") self.formattedTime = dateFormatter.string(from: date) } }
- 修改cell赋值代码,直接读取预格式化的字符串:
cell.timeLabel.text = postArray[indexPath.row].formattedTime
避坑提醒
如果拿到的时间戳是13位毫秒级数值,转Date时需要先将时间戳除以1000再传入,否则会出现时间显示为几十年后的异常问题。
内容的提问来源于stack exchange,提问作者ERIC
相关产品推荐
相关产品推荐

