Swift:夏令时的日期解析



我从服务器收到了日期时间字符串。如果日期时间是夏令时发生的确切时间,我无法解析日期。如何处理日期时间字符串为"2022-03-13T02:00:00.000000"

输出:

2022-03-13 05:00:00 +0000
2022-03-13 06:59:00 +0000
failed
2022-03-13 07:00:00 +0000
2022-03-13 08:00:00 +0000

代码:

extension String {

func date(using format: String) {
let df = DateFormatter()
df.dateFormat = format
df.timeZone = .current
if let date = df.date(from: self) {
print(date)
}
else {
print("failed")
}
}
}
"2022-03-13T00:00:00.000000".date(using: "yyyy-MM-dd'T'HH:mm:ss.SSSSSS")
"2022-03-13T01:59:00.000000".date(using: "yyyy-MM-dd'T'HH:mm:ss.SSSSSS")
"2022-03-13T02:00:00.000000".date(using: "yyyy-MM-dd'T'HH:mm:ss.SSSSSS")
"2022-03-13T03:00:00.000000".date(using: "yyyy-MM-dd'T'HH:mm:ss.SSSSSS")
"2022-03-13T04:00:00.000000".date(using: "yyyy-MM-dd'T'HH:mm:ss.SSSSSS")

您只需要设置日期格式化程序的日历属性。这也将避免使用用户设备的日历,这可能会导致解析错误的年份。不要忘记始终将日期格式化程序的区域设置为";en_US_POSIX";解析固定日期格式时:

extension String {
func date(using format: String) -> Date? {
let df = DateFormatter()
df.calendar = .init(identifier: .iso8601)
df.locale = .init(identifier: "en_US_POSIX")
df.timeZone = .current
df.dateFormat = format
df.date(from: self) 
}
}

还要注意,每次调用此方法时,此方法都会创建一个新的日期格式化程序。您还应该避免创建静态格式化程序。我还要确定日期字符串是否使用当前时区。通常是UTC时区。

采用ISO8601DateFormatter将这些字符串转换为日期,然后当您需要在应用程序中显示它们时,使用设置为所需时区的日期格式化程序。

这样一来,您就不会在夏令时转换方面遇到任何麻烦。

当然,当您需要将日期重新编码为String进行发送时,请再次使用ISO8601DateFormatter,以保持接收日期时使用的相同格式。

最新更新