ios - 无论语言环境/isDaylightSavingTime/时区如何,DateFormatter 都会为某些用户返回 nil 日期

标签 ios nsdateformatter

我们使用 Disqus 来实现我们的评论功能。它的注释时间戳是 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,时区:欧洲/伦敦,日历:公历,isDaylightSavingTime:1

  • 区域设置:en_TR,时区:Etc/GMT-3,日历:公历,isDaylightSavingTime:0

  • 区域设置:es_MX,时区:America/Mexico_City,日历:公历,isDaylightSavingTime:1

  • 区域设置:en_ID,时区:亚洲/ 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 之外,还有其他我不知道的因素吗?

最佳答案

用户设置的是 12 小时制还是 24 小时制?

iOS 可以更改日期格式化程序的格式字符串以匹配用户的设置。区域设置 en_US_POSIXrecommended for fixed formats以防止由于用户设置而导致格式更改。

关于ios - 无论语言环境/isDaylightSavingTime/时区如何,DateFormatter 都会为某些用户返回 nil 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55947313/

相关文章:

ios - 日期格式化程序在某些情况下返回 null(在 12 :59:59) 之后

cocoa - 使用 NSDateFormatter 将 UTC 转换为本地时间

在 AWS device farm 上使用 specta 进行 iOS 单元测试

ios - NSDateFormatter 不识别日期

iOS App 找不到框架头文件

ios - 不工作 UISplitViewController - WillHideViewController 未在 monotuch 中调用

swift - NSCalendarUnitDay 将当前日期显示为一位整数 int。如何将其变为 2 位数字,例如 "03"?

iphone - 将字符串转换为 NSDate 的正确方法?(iphone)

ios - Moya 请求未针对一个提供者启动,但适用于另一提供者

ios - 如何在按下背景时以动画方式隐藏选择器 View