Swift: 将 ISO8601 转换为日期
Swift: Converting ISO8601 to Date
正在尝试将 ISO8601
格式的 String
转换为 Date
并获得 nil
.
let dateString = "2020-06-27T16:09:00+00:00" // ISO8601
我尝试了两种不同的方法:
import Foundation
let df = DateFormatter()
df.timeZone = TimeZone.current
df.locale = Locale(identifier: "en_US_POSIX")
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let toDate = df.date(from: dateString)
print("toDate \(String(describing: toDate))") // output: toDate nil
我也试过:
import Foundation
let isoDateFormatter = ISO8601DateFormatter()
isoDateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
isoDateFormatter.formatOptions = [
.withFullDate,
.withFullTime,
.withDashSeparatorInDate,
.withFractionalSeconds]
let isoDate = isoDateFormatter.date(from: dateString)
print("isoDate \(isoDate)") // output: isoDate nil
String
中的日期格式是 ISO8601
。我在这里验证了它:http://jsfiddle.net/wq7tjec7/14/
无法弄清楚我做错了什么。
正如@Martin 在评论中提到的,您的日期在字符串末尾没有小数秒。
这是正确的格式:
df.dateFormat = "yyyy-MM-dd'T'HH:mm:SSxxxxx"
或者从 isoDateFormatter
的 formatOptions
数组中删除 withFractionalSeconds
,像这样:
isoDateFormatter.formatOptions = [
.withFullDate,
.withFullTime,
.withDashSeparatorInDate]
更新:正如@Leo 在评论中提到的,这里使用 Z
作为时区格式是错误的,需要改为 xxxxx
。
正在尝试将 ISO8601
格式的 String
转换为 Date
并获得 nil
.
let dateString = "2020-06-27T16:09:00+00:00" // ISO8601
我尝试了两种不同的方法:
import Foundation
let df = DateFormatter()
df.timeZone = TimeZone.current
df.locale = Locale(identifier: "en_US_POSIX")
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let toDate = df.date(from: dateString)
print("toDate \(String(describing: toDate))") // output: toDate nil
我也试过:
import Foundation
let isoDateFormatter = ISO8601DateFormatter()
isoDateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
isoDateFormatter.formatOptions = [
.withFullDate,
.withFullTime,
.withDashSeparatorInDate,
.withFractionalSeconds]
let isoDate = isoDateFormatter.date(from: dateString)
print("isoDate \(isoDate)") // output: isoDate nil
String
中的日期格式是 ISO8601
。我在这里验证了它:http://jsfiddle.net/wq7tjec7/14/
无法弄清楚我做错了什么。
正如@Martin 在评论中提到的,您的日期在字符串末尾没有小数秒。 这是正确的格式:
df.dateFormat = "yyyy-MM-dd'T'HH:mm:SSxxxxx"
或者从 isoDateFormatter
的 formatOptions
数组中删除 withFractionalSeconds
,像这样:
isoDateFormatter.formatOptions = [
.withFullDate,
.withFullTime,
.withDashSeparatorInDate]
更新:正如@Leo 在评论中提到的,这里使用 Z
作为时区格式是错误的,需要改为 xxxxx
。