DateFormatter 为简单的日期字符串返回 nil 日期

问题描述

我遇到了一个问题,尝试通过 DateFromatter 将字符串转换为日期时只产生了“nil”,我不知道我哪里出错了。代码非常简单:

    let testDate = "2021"

    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = "yyyy"

    formatter.timeZone = TimeZone(secondsFromGMT: 0)


    let date = formatter.date(from: testDate)

请注意,这比原来简单得多,我尝试格式化的日期实际上是:

"2021-05-01T01:00:00Z"

但我已经将其精简以缩小问题所在。

从上面可以看出,我已经精简到一年,使用 en_US_POSIX 配置 DateFormatter 并仅使用“yyyy”作为格式。这在 Playgrounds 中有效,但在我的 Xcode 模拟器(在美国语言环境中)或我自己的物理 iPhone(设置为英国语言环境)中不起作用。话虽如此,我不知道为什么语言环境会很重要,因为有问题的字符串只是一年 - 它甚至没有错误的年份,只是零。

我不确定我哪里出错了。

解决方法

Xcode Debugger 有一个 bug,正如您在此 post 中看到的那样,即使解析日期成功,它也会将可选日期显示为 nil。如果您打印可选日期,您将看到结果日期。

,

请为日期字符串使用正确的格式:

formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"

而不是:

formatter.dateFormat = "yyyy"

具有特定格式的每个日期字符串,如下代码:

let testDate = "2021"
    formatter.dateFormat = "yyyy"

let testDate = "2021-05-01T01:00:00Z"
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"

有关详细信息,请参阅此链接:https://stackoverflow.com/a/52297497/5140621