由于某些原因,某些设备无法将字符串转换为日期。
这是我的日期转换代码:
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的原因是什么?
答案 0 :(得分:5)
如果您向用户显示日期,不会设置固定日期格式字符串。如果您使用的是固定格式的日期,请先修复您的区域设置。
有关详细信息,请参阅标题为“NSDateFormatter和Internet日期”的Technical Q&A QA1480。以下是相关的摘录(格式化我的):
问:我正在使用NSDateFormatter来解析互联网风格的日期,但对于某些地区的某些用户来说这是失败的。我已经设置了一个特定的日期格式字符串;不应该强迫NSDateFormatter独立于用户的区域设置工作吗?
答:不会。虽然设置日期格式字符串似乎适用于大多数用户,但这不是解决此问题的正确方法。有许多地方格式字符串以意想不到的方式运行。 (...)
如果您使用的是用户可见日期,则应避免设置固定日期格式字符串,因为很难预测格式字符串在所有可能的用户配置中的表达方式。相反,您应该限制自己设置日期和时间样式(通过
NSDateFormatter.dateStyle
和NSDateFormatter.timeStyle
)或从模板生成日期格式字符串(使用NSDateFormatter.setLocalizedDateFormatFromTemplate(String)
)。另一方面,如果您使用固定格式的日期,则应首先将日期格式化程序的区域设置设置为适合您的固定格式。在大多数情况下,最佳区域设置选择的是“en_US_POSIX”,这是一个专门设计用于产生美国英语结果的语言环境,无论用户和系统偏好如何。