You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中Unix时间戳转可读日期字符串显示异常问题

解决Unix时间戳转日期显示异常的问题

问题根源

你遇到的问题核心在于时间戳单位不匹配:传入的1518393600000是毫秒级的Unix时间戳,但NSDate(timeIntervalSince1970:)方法接收的是秒级的时间间隔。直接把毫秒数当成秒数传入,相当于把时间往前推了1000倍,自然会显示出1985年的错误日期。

修正方案

我帮你调整了代码,主要做了这几个关键改动:

  • 将毫秒级时间戳转换为秒级(除以1000)
  • 替换强制解包为安全的可选绑定,避免崩溃
  • 自定义日期格式,确保输出完全符合你的预期

修正后的代码

struct myDateRange {
    var startDate: NSNumber?
    var endDate: NSNumber?
}

func configureDate(date: myDateRange) {
    // 安全解包并转换时间戳单位
    guard let timestampMs = date.startDate?.doubleValue else {
        timeLabel.text = "Invalid Date"
        return
    }
    // 毫秒转秒
    let timestampSec = timestampMs / 1000
    let date = Date(timeIntervalSince1970: timestampSec)
    
    let timeFormat = DateFormatter()
    // 自定义格式匹配预期输出:MM/dd/yy, HH:mm
    timeFormat.dateFormat = "MM/dd/yy, HH:mm"
    // 可按需设置时区,避免时区差异影响显示
    timeFormat.timeZone = TimeZone(identifier: "UTC")
    
    let currentTime = timeFormat.string(from: date)
    timeLabel.text = currentTime
}

验证结果

当传入Optional(1518393600000)时,转换后的秒级时间戳是1518393600,对应的日期就是2018年2月12日12:00(UTC时区),完全符合你的预期显示。

额外提示

  • 尽量避免使用as!强制解包,一旦startDate为nil会直接崩溃,用guard let或者if let处理可选值更安全
  • 如果你的应用面向不同时区用户,记得设置合适的timeZone,避免日期显示因时区偏移出现偏差

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:31:31