Swift中如何将Firestore时间戳转换为日期格式正常展示
问题根因
你当前直接把存储的Int类型时间戳强转为字符串赋值给timeLabel,页面自然会显示原始数字值,只需要把时间戳先转为Date对象,再通过日期格式化工具输出可读字符串即可。
可选修改方案
你可以根据自己的代码习惯选其中一种:
方案1:直接在列表代理方法中修改(改动最小)
修改位置在FeedVC的tableView(_:cellForRowAt:)方法里,把原来赋值时间的代码替换掉即可。
注意:先确认你拿到的时间戳是秒级(10位数字)还是毫秒级(13位数字),如果是毫秒级需要先除以1000转成秒级再处理。
替换后的代码片段:
// 删除原来的代码:cell.timeLabel.text = String(postArray[indexPath.row].timestamp) let post = postArray[indexPath.row] // 毫秒级时间戳就改成 TimeInterval(post.timestamp / 1000) let postDate = Date(timeIntervalSince1970: TimeInterval(post.timestamp)) let dateFormatter = DateFormatter() // 自定义你需要的日期格式,比如"yyyy年MM月dd日 HH:mm"会显示成「2024年05月20日 14:30」 dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" cell.timeLabel.text = dateFormatter.string(from: postDate)
方案2:在数据模型层封装(推荐,复用性更高)
如果项目里多个位置需要展示文章发布时间,直接在Post模型里加一个计算属性,统一处理日期格式化逻辑,不用每个页面重复写格式化代码,还能避免DateFormatter反复初始化带来的滚动卡顿问题。
第一步:修改Post模型代码:
import Foundation struct Post{ var email:String var caption:String var imageUrl:String var timestamp:Int // 新增:静态格式化工具,全局只初始化一次 private static let postDateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm" // 需要跟随系统时区/语言的话可以加下面两行 // formatter.locale = Locale.current // formatter.timeZone = TimeZone.current return formatter }() // 新增:直接返回格式化好的时间字符串 var formattedPublishTime: String { // 毫秒级时间戳替换为 TimeInterval(timestamp / 1000) let date = Date(timeIntervalSince1970: TimeInterval(timestamp)) return Post.postDateFormatter.string(from: date) } init(email:String,caption:String,imageUrl:String,timestamp:Int) { self.email = email self.caption = caption self.imageUrl = imageUrl self.timestamp = timestamp } }
第二步:修改FeedVC里的赋值代码:
cell.timeLabel.text = postArray[indexPath.row].formattedPublishTime
补充说明
常用的日期格式占位符:
yyyy:4位年份MM:2位月份dd:2位日期HH:24小时制的小时hh:12小时制的小时mm:分钟ss:秒a:显示上午/下午标识
按需组合即可,比如要显示「5月20日 下午2:30」就把dateFormat改成MM月dd日 a h:mm。
内容的提问来源于stack exchange,提问作者ERIC
相关产品推荐
相关产品推荐

