字符串中的DateFormatter日期返回nil

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

这是我的日期转换代码:

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

现在,通过我的分析平台,我将在此时返回nil。 我不知道为什么会这样。 我认为它与本地和时区或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") 

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

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

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

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

问:我正在使用NSDateFormatter来解析互联网风格的日期,但对于某些地区的某些用户来说,这会失败。 我已经设置了一个特定的日期格式字符串; 不应该强制NSDateFormatter独立于用户的区域设置工作?

答:不会。虽然设置日期格式字符串似乎适用于大多数用户,但这不是解决此问题的正确方法。 有许多地方格式字符串以意想不到的方式运行。 (……)

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

另一方面, 如果您使用的是固定格式的日期,则应首先将日期格式化程序的区域设置设置为适合您的固定格式的区域设置。 在大多数情况下,选择的最佳语言环境是“en_US_POSIX”,这是一种专门用于产生美国英语结果的语言环境,无论用户和系统偏好如何。