字符串中的DateFormatter日期返回nil

时间:2016-12-18 08:52:37

标签: ios swift date nsdateformatter local

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

这是我的日期转换代码:

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

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

更多详情......

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

  

timezone - Asia / Muscat

     

local - en_GB

     

string - “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的原因是什么?

1 个答案:

答案 0 :(得分:5)

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

有关详细信息,请参阅标题为“NSDateFormatter和Internet日期”的Technical Q&A QA1480。以下是相关的摘录(格式化我的):

  

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

     

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

     

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

     

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