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

DateFormatter is returning nil date for a simple date string

我遇到了一个问题,我尝试通过 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(设置为英国语言环境)中不起作用。话虽这么说,我不知道为什么语言环境会很重要,因为有问题的字符串只是一年 - 它甚至没有错误的年份,只是零。

我不确定我哪里出错了。

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

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"

有关详细信息,请参阅此 link:

Xcode 调试器有一个 bug as you can see in this 即使在解析日期成功时它也会将可选日期显示为 nil。如果您打印可选日期,您将看到结果日期。