从Unix时间戳获取日期时间时返回错误日期的问题排查
解决Unix时间戳转日期显示错误的问题
大概率是这两个常见原因导致你拿到错误日期的,我来帮你排查和修正:
1. 先确认时间戳的单位是否匹配
你代码里用的NSDate(timeIntervalSince1970:)是专门处理秒级Unix时间戳的,但很多后端接口返回的是毫秒级的时间戳(通常是13位数字)。如果直接把毫秒级数值传进去,计算出来的日期会偏差极大(要么跳到几十亿年后,要么回到几十年前)。
修正方法很简单,把时间戳先除以1000转成秒:
func getDateFromStamp(timeInterval:Int) -> String{ // 若你的时间戳是毫秒级,必须除以1000转成秒 let date = NSDate(timeIntervalSince1970: TimeInterval(timeInterval) / 1000) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEEE, MMM d, h:mm a" let dateString = dateFormatter.string(from: date as Date) return dateString }
2. 明确设置时区(避免设备时区差异)
DateFormatter默认会使用当前设备的系统时区,但如果你的业务需要统一用服务器时区(比如UTC),或者要确保不同时区的设备显示一致的日期,就必须手动指定时区:
比如设置为UTC时区的示例:
func getDateFromStamp(timeInterval:Int) -> String{ let date = NSDate(timeIntervalSince1970: TimeInterval(timeInterval) / 1000) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEEE, MMM d, h:mm a" // 明确指定时区,这里用UTC举例,也可以用TimeZone.current获取本地时区 dateFormatter.timeZone = TimeZone(identifier: "UTC") let dateString = dateFormatter.string(from: date as Date) return dateString }
额外小提示
你可以先打印一下传入的timeInterval数值,看它是10位(秒级)还是13位(毫秒级),这能快速定位问题核心;如果是秒级时间戳但日期依然不对,那基本就是时区设置的问题,检查下设备时区或者强制指定你需要的时区即可。
内容的提问来源于stack exchange,提问作者Sagaya Abdul
相关产品推荐
相关产品推荐

