Swift实现GMT+2日期字符串转GMT 0区标准格式日期
嘿,这个需求我之前做项目时刚好碰到过,用Swift实现其实很直观,核心就是先把带时区的字符串解析成Date对象,再将Date格式化为UTC时区的目标字符串。下面是完整的实现步骤和代码:
具体实现步骤
1. 解析原始日期字符串
首先需要创建一个DateFormatter,配置成和你输入的日期格式、时区完全匹配的规则,这样才能把字符串正确转换成Date对象(注意:Date本身是时区无关的,它存储的是相对于UTC的时间戳)。
// 初始化输入格式的DateFormatter let inputFormatter = DateFormatter() // 设置输入的日期格式,和原始字符串完全对应 inputFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss" // 指定输入日期的时区:GMT+2(用秒数计算更稳妥:TimeZone(secondsFromGMT: 2*3600)) inputFormatter.timeZone = TimeZone(secondsFromGMT: 7200) // 必须设置locale为en_US_POSIX,避免系统区域设置影响解析(比如某些地区会混淆日和月的顺序) inputFormatter.locale = Locale(identifier: "en_US_POSIX") // 你的原始日期字符串 let originalDateString = "30-07-2019 12:05:00" // 解析成Date对象 guard let targetDate = inputFormatter.date(from: originalDateString) else { print("⚠️ 日期解析失败,请检查格式或时区设置") return }
2. 格式化为UTC时区的目标字符串
接下来创建另一个DateFormatter,配置成你需要的输出格式和UTC时区,把Date对象转换成最终的字符串。
// 初始化输出格式的DateFormatter let outputFormatter = DateFormatter() // 设置目标输出格式 outputFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss +0000" // 指定输出时区为UTC outputFormatter.timeZone = TimeZone(identifier: "UTC") // 同样设置locale避免系统区域干扰 outputFormatter.locale = Locale(identifier: "en_US_POSIX") // 生成最终的UTC日期字符串 let utcDateString = outputFormatter.string(from: targetDate) print(utcDateString) // 输出结果:2019-07-30 10:05:00 +0000
关键注意点
- Locale设置:一定要加上
en_US_POSIX,否则当系统语言/区域设置变化时,日期解析或格式化可能出错(比如部分地区会颠倒日和月的解析顺序)。 - 时区设置:输入的时区必须和原始日期的时区严格对应(这里是GMT+2),输出时区固定为UTC才能得到正确的时间偏移转换。
- Date对象本质:
Date本身不存储时区信息,它只是一个UTC时间戳,所有的时区转换都是通过DateFormatter来完成的。
内容的提问来源于stack exchange,提问作者j___.___j
相关产品推荐
相关产品推荐

