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

如何将ISO格式日期字符串转换为设备当前时区对应时间?

问题原因分析
  1. 解析带时区标识的ISO时间字符串时,DateFormatter的timeZone属性会被字符串内自带的时区信息(末尾的Z代表UTC+0)覆盖,所以你设置dateFormatter.timeZone = .current对解析结果没有影响。解析出来的Date本身是代表全球统一的时间点,本身不携带时区属性。
  2. 第一段代码输出错误的核心原因是第二个格式化器用了hh:mm格式符:hh是12小时制的小时表示,04:00其实就是16:00的12小时制写法,要24小时制的输出应该用大写的HH:mm。
更优实现方案

所有方案都不需要手动拼接日期组件、处理前导补零逻辑,完全依赖系统API实现,更简洁鲁棒。

方案1:修正原有DateFormatter的格式符

let dateString = "2021-04-10T10:00:01.594119Z"
// 解析ISO时间,字符串自带的Z会被自动识别,不需要额外设置timeZone
let parseFormatter = DateFormatter()
parseFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
guard let date = parseFormatter.date(from: dateString) else {
    // 自定义解析错误处理逻辑
    fatalError("日期解析失败")
}
// 格式化为当前时区的24小时制时分
let outputFormatter = DateFormatter()
outputFormatter.timeZone = .current
outputFormatter.dateFormat = "HH:mm" // 大写HH代表24小时制
let result = outputFormatter.string(from: date)
print(result) // 输出16:00,和手动获取组件的结果一致

方案2:用系统自带的ISO8601DateFormatter(推荐,iOS 10+支持)

不需要手动写格式化字符串,避免写错格式符的问题:

let dateString = "2021-04-10T10:00:01.594119Z"
let parseFormatter = ISO8601DateFormatter()
parseFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
guard let date = parseFormatter.date(from: dateString) else {
    fatalError("日期解析失败")
}
let outputFormatter = DateFormatter()
outputFormatter.timeZone = .current
outputFormatter.dateFormat = "HH:mm"
let result = outputFormatter.string(from: date)
print(result)

方案3:封装为Date扩展方便复用

如果需要频繁做该格式转换,可以封装为全局可用的扩展方法:

extension Date {
    func currentTimezoneHourMinuteString() -> String {
        let formatter = DateFormatter()
        formatter.timeZone = .current
        formatter.dateFormat = "HH:mm"
        return formatter.string(from: self)
    }
}

// 调用示例
let dateString = "2021-04-10T10:00:01.594119Z"
let parseFormatter = ISO8601DateFormatter()
parseFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
if let date = parseFormatter.date(from: dateString) {
    print(date.currentTimezoneHourMinuteString()) // 输出16:00
}

内容的提问来源于stack exchange,提问作者Rustam-Deniz Emirali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 13:54:05