Ios DateFormatter为某些用户返回零日期,而不考虑语言环境/isDaylightSavingTime/timezone
我们使用disqs作为我们的评论功能。其注释时间戳采用ISO8601日期格式,例如Ios DateFormatter为某些用户返回零日期,而不考虑语言环境/isDaylightSavingTime/timezone,ios,nsdateformatter,Ios,Nsdateformatter,我们使用disqs作为我们的评论功能。其注释时间戳采用ISO8601日期格式,例如“2019-12-11T01:45:23”。我们尝试使用DateFormatter解析该字符串,设置如下: let dateFormatter = DateFormatter() dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" return dateForm
“2019-12-11T01:45:23”
。我们尝试使用DateFormatter解析该字符串,设置如下:
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
return dateFormatter
它适用于大多数用户。但是,我们会收到格式化程序返回的少量用户的报告nil
。我们对原因的初步假设如下
- 日期格式“yyyy-MM-dd'T'HH:MM:ss”错误
- 地点
- 时区
- 夏时制使一些时间在理论上不存在
- 历法
- 或者别的什么
- 地区:
,时区:en_GB
,日历:格里高利,isDaylightSavingTime:1Europe/London
- 地区:
,时区:en\u TR
,日历:格里高利,isDaylightSavingTime:0Etc/GMT-3
- 地区:
,时区:es_MX
,日历:格里高利,isDaylightSavingTime:1America/Mexico_City
- 地区:
,时区:en_ID
,日历:格里高利,isDaylightSavingTime:0Asia/Jakarta
[
"2019-01-11T01:45:23",
"2019-02-11T01:45:23",
"2019-03-11T01:45:23",
"2019-04-10T01:45:23",
"2019-04-11T01:45:23",
"2019-04-12T01:45:23",
"2019-05-11T01:45:23",
"2019-06-11T01:45:23",
"2019-07-11T01:45:23",
"2019-08-11T01:45:23",
"2019-09-11T01:45:23",
"2019-10-11T01:45:23",
"2019-11-11T01:45:23",
"2019-12-11T01:45:23",
])
我们后来发现还有另一个日期格式化程序,名为ISO8601DateFormatter
。它似乎更适合于这种解析。下面是我们设置它的方法
let dateFormatter = ISO8601DateFormatter()
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.formatOptions = [.withFullDate, .withTime, .withDashSeparatorInDate, .withColonSeparatorInTime]
return dateFormatter
使用此ISO8601DateFormatter
,问题已得到解决
但是我仍然想知道是什么原因导致
DateFormatter
在某些设备上失败?除了locale/isDaylightSavingTime/timezone之外,还有其他我不知道的因素吗 请使用带时区的ISO8601日期格式
"2019-12-11T01:45:23.000Z"
格式:
“XXXX-XX-XX”=年、月、日,
“T”=分隔符
“XX:XX:XX.XXX”=小时、分钟、秒、毫秒
“Z”=零偏移的时区指示器,又称UTC、GMT、祖鲁时间
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
return dateFormatter
对于仍然面临此问题的任何人,对我来说,有效的方法是设置
dateFormatter.islenent=true
,正如这里所述:是用户设置的12小时还是24小时时钟
iOS可以更改日期格式化程序的格式字符串以匹配用户的设置。区域设置
en_US\u POSIX
是为了防止由于用户设置而更改格式。它来自第三方服务Disqus,因此我无法控制传入的日期字符串格式。您有什么解决方案吗?不管怎样,我也得零分。