Swift中ISO8601日期解析时间显示错误问题求助
解决Swift中ISO8601日期解析的时区偏差问题
嘿,我来帮你搞定这个日期解析的问题!你遇到的时间显示错误,核心原因是时区设置不匹配。
你处理的日期字符串2020-06-09T18:11:26.904Z末尾的Z代表UTC时区,但你的DateFormatter默认会使用设备的本地时区。当你把解析后的Date对象转换成字符串时,它会把这个绝对时间转成本地时区的时间,所以才会出现和预期不符的11:11 pm(应该是你所在时区比UTC快5小时,18+5=23,也就是晚上11点)。
修改后的代码
只需要在生成最终字符串前,给DateFormatter指定UTC时区即可,调整后的代码如下:
let df = DateFormatter() df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" df.timeZone = TimeZone(identifier: "UTC") // 解析时明确使用UTC时区,避免歧义 guard let date = df.date(from: dateTime) else { return nil } // 转换为目标格式时,同样指定UTC时区 df.dateFormat = "dd MMM, hh:mm a" df.amSymbol = "am" df.pmSymbol = "pm" df.timeZone = TimeZone(identifier: "UTC") // 关键:确保输出UTC时间的字符串 let stringFromDate = df.string(from: date) return stringFromDate
补充说明
Date对象本身是没有时区概念的,它存储的是从2001年1月1日00:00:00 UTC开始的绝对时间间隔。所以最终显示的时间完全由DateFormatter的timeZone属性决定——你想要显示UTC时间,就把时区设为UTC;想要显示本地时间,就保留默认设置即可。
内容的提问来源于stack exchange,提问作者Mir Muhammad Hadi Ali
相关产品推荐
相关产品推荐

