Ios DateFormatter为某些用户返回零日期,而不考虑语言环境/isDaylightSavingTime/timezone

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

我们使用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 dateFormatter
它适用于大多数用户。但是,我们会收到格式化程序返回的少量用户的报告
nil
。我们对原因的初步假设如下

  • 日期格式“yyyy-MM-dd'T'HH:MM:ss”错误
  • 地点
  • 时区
  • 夏时制使一些时间在理论上不存在
  • 历法
  • 或者别的什么
所有这些都是我们用来设置DateFormatter的参数。我们尝试了许多组合,包括从用户报告中获得的组合。我们尝试了与用户报告中相同的日期、区域设置、时区、日历和时间本身

  • 地区:
    en_GB
    ,时区:
    Europe/London
    ,日历:格里高利,isDaylightSavingTime:1

  • 地区:
    en\u TR
    ,时区:
    Etc/GMT-3
    ,日历:格里高利,isDaylightSavingTime:0

  • 地区:
    es_MX
    ,时区:
    America/Mexico_City
    ,日历:格里高利,isDaylightSavingTime:1

  • 地区:
    en_ID
    ,时区:
    Asia/Jakarta
    ,日历:格里高利,isDaylightSavingTime:0

但我们无法繁殖

此外,我们还做了另一项测试,测试日期分布在全年。并对每个用户执行隐藏解析测试。在返回nil日期的设备上,似乎每个日期都返回nil。日期字符串列表如下所示

    [
      "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,因此我无法控制传入的日期字符串格式。您有什么解决方案吗?不管怎样,我也得零分。