字符串中的DateFormatter日期返回nil

Dav*_*Ari 9 date local nsdateformatter ios swift

由于某种原因,某些设备无法将字符串转换为日期.

这是我的日期转换代码:

func dateFromString(string: String) -> Date? {
    let f = DateFormatter.init()
    f.dateFormat = "yyyy-MM-dd HH:mm:ss"
    return f.date(from: string)
}
Run Code Online (Sandbox Code Playgroud)

现在,通过我的分析平台,我会在此返回时捕获.我不知道为什么会这样.我认为它与本地和时区或12/24h设置有关,但我无法弄清楚问题是什么.

更多细节...

我跟踪了以下导致nil返回的设置:

时区 - 亚洲/马斯喀特

local - en_GB

字符串 - "2016-12-18 08:31:43"

但是当我在操场上跑步时,我得到一个有效的日期:

let f = DateFormatter.init()
f.dateFormat = "yyyy-MM-dd HH:mm:ss"
f.locale = Locale.init(identifier: "en_GB")
f.timeZone = TimeZone.init(identifier: "Asia/Muscat")

let s = f.date(from: "2016-12-18 08:31:43")
Run Code Online (Sandbox Code Playgroud)

"2016年12月18日,上午6:31"

是什么原因导致DateFromatter返回nil?

Ant*_*off 5

如果您要向用户显示日期,请不要设置固定日期格式字符串。如果您使用固定格式的日期,请先修复您的语言环境

有关更多详细信息,请参见标题为“ NSDateFormatter和Internet日期”的技术问答QA1480。以下是相关摘录(格式化我的文章):

问:我正在使用NSDateFormatter来解析Internet样式的日期,但是对于某些地区的某些用户而言,这将失败。我设置了一个特定的日期格式字符串;那不应该强制NSDateFormatter独立于用户的区域设置工作吗?

答:不会。虽然设置日期格式字符串对于大多数用户来说似乎可以使用,但这不是解决此问题的正确方法。在很多地方,格式字符串的行为都异常。(...)

如果要使用用户可见的日期,则应避免设置固定的日期格式字符串,因为很难预测格式字符串在所有可能的用户配置中的表示方式。相反,您应该限制自己设置日期和时间样式(通过NSDateFormatter.dateStyleNSDateFormatter.timeStyle),或从模板生成日期格式字符串(使用NSDateFormatter.setLocalizedDateFormatFromTemplate(String))。

另一方面,如果您使用固定格式的日期,则应首先将日期格式器的语言环境设置为适合您的固定格式的语言环境。在大多数情况下,最佳选择的语言环境是“ en_US_POSIX”,该语言环境专门设计用于产生美国英语结果,而不考虑用户和系统偏好。

  • 好的!!!我想我已经找到了。我通读了 QA 却没有意识到设置的顺序很重要:**一旦您将“en_US_POSIX”设置为日期格式化程序的语言环境,您就可以设置日期格式字符串,日期格式化程序将始终如一地运行全部用户。** (2认同)