将包含日期的字符串转换为日期

Convert string containing date to Date

我在将字符串转换为 swift 日期时遇到问题,也许这是显而易见的事情,但我不明白。

我正在尝试将 "Jan 18, 2022 04:39PM GMT" 这个字符串转换成日期。我的代码如下所示:

let str = "Jan 18, 2022 04:39PM GMT"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM d, YYYY hh:mma z"

let date = dateFormatter.date(from: str)
print(date)

控制台显示:Optional(2021-12-19 16:39:00 +0000)

知道这个格式化程序有什么问题吗?

除了显示为可选的日期外,您的格式字符串似乎有误。 “YYYY”应该是“yyyy”,所以分配格式化程序的整行应该是:

dateFormatter.dateFormat = "MMM d, yyyy hh:mma z"

该更改产生输出

“可选(2022-01-18 16:39:00 +0000)”

此外,你真的应该强制日历为公历或 iso8601,并将其语言环境设置为 "en_US_POSIX:

日期格式化程序的改进版本可能如下所示:

(来自 Leo 的编辑。)

let str = "Jan 18, 2022 04:39PM GMT"
let dateFormatter = DateFormatter()
dateFormatter.calendar = .init(identifier: .iso8601)
dateFormatter.locale = .init(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.dateFormat = "MMM d, yyyy hh:mma z"

if let date = dateFormatter.date(from: str) {
    let dateString = dateFormatter.string(from: date)
    print(dateString == str)  // true
}

转换日期写的代码是正确的,转换后的日期也是正确的。但最终结果是可选的,因此您得到的日期类似于 Optional(2021-12-19 16:39:00 +0000)。 日期格式化程序也是错误的。 所以请打开日期以获取没有可选的实际日期。

dateFormatter.dateFormat = "MMM d, yyyy hh:mma z"
guard let convertedDate = date else {
return
}
print(convertedDate)