如何将yyyy.MM.dd HH:mm格式字符串转换为Date并解决时区偏移问题
字符串转Date时间偏差问题解决
问题本质
你观察到的时间偏差不是日期解析逻辑出错,而是两个常见的时区认知误区导致的:
Date类型是绝对时间点,本身不携带时区信息,直接打印Date会默认输出UTC(零时区)的时间。KST是UTC+9时区,你输入的KST时区2021.09.28 23:39,对应UTC时间就是2021-09-28 14:39,打印结果本身是正确的- 你原代码中使用
Calendar.current取日期组件时,Calendar默认继承当前系统的时区设置,和你解析时用的KST时区不一致,就会得到和输入不符的时分结果
正确实现代码
let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy.MM.dd HH:mm" // 固定解析用locale为en_US_POSIX,避免系统区域设置变化(比如12/24小时制切换)导致解析失败 dateFormatter.locale = Locale(identifier: "en_US_POSIX") dateFormatter.timeZone = TimeZone(abbreviation: "KST") // 解析得到对应时间点的Date对象 guard let date = dateFormatter.date(from: "2021.09.28 23:39") else { // 自定义解析失败的处理逻辑 fatalError("输入字符串不符合指定日期格式") } // 取KST时区的日期组件,需要给Calendar手动设置对应时区 var calendar = Calendar.current calendar.timeZone = TimeZone(abbreviation: "KST")! let dateComponents = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: date) // 此时dateComponents.hour为23,dateComponents.minute为39,和输入完全一致 // 如果需要将Date转回原格式字符串输出,复用同一个formatter即可 print(dateFormatter.string(from: date)) // 输出:2021.09.28 23:39
核心注意点
所有涉及日期解析、日期转组件、日期转字符串的操作,必须全程统一时区设置,不要混用不同时区的DateFormatter和Calendar实例。
内容的提问来源于stack exchange,提问作者71873
相关产品推荐
相关产品推荐

