字符串到日期的转换有时会使用 DateFormatter 返回 nil

Posted

技术标签:

【中文标题】字符串到日期的转换有时会使用 DateFormatter 返回 nil【英文标题】:String to date conversion sometimes returns nil with DateFormatter 【发布时间】:2021-12-11 00:29:34 【问题描述】:

我刚刚阅读了这个post,其中详细说明了在尝试将给定字符串转换回日期之前,您需要在格式之前设置语言环境。

我有以下遵循该格式的代码,但从字符串到日期的转换似乎仍然返回nil,尽管在操场上它似乎工作正常。

// originalDate style is the .full style, "Friday, December 10, 2021 at 4:17:04 PM Pacific Standard Time"
let df: DateFormatter = DateFormatter()
df.locale = Locale(identifier: "en_US_POSIX")
df.dateFormat = "MMM d, yyyy" // Sep 12, 2018 format'

let newDate = df.date(from: originalDate)
let newStringDate = df.string(from: newDate!) // throws found nil when unwrapping

这可能是什么原因造成的?

编辑 1:我正在使用 SQLite.swift 从 sqlite 数据库中提取字符串类型

【问题讨论】:

originalDate的格式需要匹配df.dateFormat。 请分享原始日期样式字符串 我建议您以更简单(更短)的格式存储您的日期。 谢谢大家!我没有意识到你必须有相同的格式。我想我必须将其转换为 Date 然后将其转换回我想要的字符串格式或以较短的格式存储它 【参考方案1】:

回答您的问题(字符串到日期为 nil):从字符串转换为日期时,您必须使用与 String 相同的格式。我假设你的 cmets 的 originalDate 。您必须像这样更改代码

let originalDate = "Friday, December 10, 2021 at 4:17:04 PM"
let df: DateFormatter = DateFormatter()
df.locale = Locale(identifier: "en_US_POSIX")
df.dateFormat = "EEEE, MMMM d, yyyy 'at' h:mm:ss a"

let newDate = df.date(from: originalDate)
print(newDate)

如果您再次想要从日期开始的字符串,那么您可以再次指定您想要的格式。

df.dateFormat = "MMM d, yyyy" // Sep 12, 2018 format'
let newStringDate = df.string(from: newDate!)
print(newStringDate)

注意:如果您尝试使用 print 在控制台中记录 newDate 值,有时它会显示为 nil。在这种情况下,您可以在控制台中尝试“po newDate”。

【讨论】:

谢谢。我将格式更改为相同的样式,现在它可以工作了。我将不得不更改存储日期的方式或进行一些额外的转换。

以上是关于字符串到日期的转换有时会使用 DateFormatter 返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

DateFormat抽象类实现日期与字符串的转换

API--DateFormat-字符串和日期对象之间的转换

dateformat将日期类型转换为指定的字符串格式的方法名是啥

java怎么将String转换成日期

通过匹配字符串中的日期格式使用Java提取日期

一个日期转换时需要注意的问题