Swift中如何将日期字符串2021-30-06T05:00:00+07:00转换为hh:mm:ss格式时间(问题代码求助)
问题排查与解决方案
首先,你的代码存在几个关键问题,导致日期解析失败,进而无法得到预期的时间格式:
1. 日期格式与输入字符串不匹配
你的输入日期字符串是 2021-30-06T05:00:00+07:00,其中日期部分是年-日-月(yyyy-dd-MM),但你初始设置的 dateFormat 是 yyyy-MM-dd'T'HH:mm:ss,这会让解析器误以为 30 是月份(显然不存在30月),直接导致解析返回 nil,后续强制解包 date! 还会引发崩溃。
2. 未处理时区偏移信息
输入字符串末尾的 +07:00 是时区偏移量,你的初始格式没有包含这部分规则,这也是解析失败的重要原因。
3. 使用了过时的API
Swift 中推荐使用 DateFormatter 和 TimeZone 替代 Objective-C 时代的 NSDateFormatter 和 NSTimeZone,两者虽然兼容,但新API更符合Swift的语法风格。
修正后的代码
下面是解决问题的完整代码,附带详细注释:
// 创建DateFormatter实例 let dateFormatter = DateFormatter() // 设置与输入字符串完全匹配的格式:年-日-月T时:分:秒+带冒号的时区偏移 dateFormatter.dateFormat = "yyyy-dd-MM'T'HH:mm:ssxxx" // 安全解析日期字符串,避免强制解包引发崩溃 guard let date = dateFormatter.date(from: "2021-30-06T05:00:00+07:00") else { print("日期解析失败,请检查格式是否匹配") return } // 设置输出格式为目标的HH:mm:ss dateFormatter.dateFormat = "HH:mm:ss" // 若需要转换为本地时区的时间,设置时区为当前设备时区 dateFormatter.timeZone = TimeZone.current // 生成并打印目标时间字符串 let timeStamp = dateFormatter.string(from: date) print(timeStamp) // 结果会根据本地时区变化,比如本地是GMT+8时会输出06:00:00
额外说明
- 如果不需要转换为本地时区,只想保留原时区(GMT+7)的时间,你可以去掉
dateFormatter.timeZone = TimeZone.current这一行,或者手动设置为TimeZone(identifier: "GMT+7"),此时输出会是05:00:00。 - 日期格式符号要严格对应:
yyyy代表4位年份,dd代表2位日期,MM代表2位月份,HH代表24小时制的小时,xxx专门匹配带冒号的时区偏移(如+07:00)。
内容的提问来源于stack exchange,提问作者edo oktarifa
相关产品推荐
相关产品推荐

