Swift 5 DateFormatter解析含AM/PM的时间字符串结果不符合预期
问题原因说明
- 未显式指定Locale导致AM/PM标识识别异常:DateFormatter默认继承系统当前Locale,如果系统Locale为非英文区域(比如中文zh_CN),格式符
a对应的匹配规则是中文的「上午/下午」,无法识别英文的「AM/PM」,会导致解析结果错误甚至返回nil。解析包含英文AM/PM的时间字符串时,需要显式设置Locale为英文区域,推荐使用Locale(identifier: "en_US_POSIX"),这个Locale是专门用于固定格式时间解析的,不会受系统个性化设置影响。 - 直接打印Date实例输出的是UTC时区时间,和本地时区存在差值:Date实例本身只代表时间戳,不携带时区信息,调用
print(date)时系统默认会输出UTC(0时区)的时间。如果你当前设备时区是东八区(UTC+8),解析得到的东八区下午4点(16:15:45)转换为UTC时间就是8:15:45,所以你看到的输出Optional(2020-07-28 08:15:45 +0000)本身是正确的,只是输出的时区和你预期的本地时区不一致。
验证及修复示例代码
import Foundation let dtstr = "Tuesday, July 28, 2020 4:15:45 PM" let formatter = DateFormatter() // 显式设置固定Locale,保证AM/PM可以正确识别 formatter.locale = Locale(identifier: "en_US_POSIX") formatter.dateFormat = "eeee, MMMM d, yyyy h:m:s a" // 可选:如果需要固定时区解析,可显式指定timeZone // formatter.timeZone = TimeZone(identifier: "Asia/Shanghai") guard let date = formatter.date(from: dtstr) else { fatalError("时间解析失败") } // 用当前时区格式化输出验证结果 let outputFormatter = DateFormatter() outputFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" outputFormatter.timeZone = TimeZone.current print("本地时区时间:\(outputFormatter.string(from: date))") // 输出2020-07-28 16:15:45 print("UTC时区时间:\(date)") // 输出2020-07-28 08:15:45 +0000
内容的提问来源于stack exchange,提问作者Sushi Bear
相关产品推荐
相关产品推荐

