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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:15:01