80年代的4月1日没有在iOS 10.0中parsing

我发现DateFormatter date(from:)方法不能parsing一些特定的date。 方法返回1981年4月1日nil 。 这是基金会的错误吗? 我们能做些什么来parsing这些date?

Xcode 8.0,iOS SDK 10.0。 下面是一个简短的操场示例的截图: 一个简短的操场例子的截图

如果夏令时恰好在午夜开始,就会出现这个问题,1981 – 1984年的莫斯科就是这种情况(例如参见俄罗斯莫斯科时钟变化(Moskva) )。

这也被观察到

  • 为什么NSDateFormatter返回这4个时区的无date? 和
  • 为什么NSDateFormatter在巴西时区为19/10/2014返回null?

例如,1984年4月1日午夜,钟表被调整了一个小时,这意味着在该时区不存在date“1984-04-01 00:00”

 let dFmt = DateFormatter() dFmt.dateFormat = "yyyy-MM-dd" dFmt.timeZone = TimeZone(identifier: "Europe/Moscow") print(dFmt.date(from: "1984-04-01")) // nil 

作为一种解决scheme,您可以告诉date格式化程序是“宽松的”:

 dFmt.isLenient = true 

然后它将返回当天的第一个有效date:

 dFmt.isLenient = true if let date = dFmt.date(from: "1984-04-01") { dFmt.dateFormat = "yyyy-MM-dd HH:mm:ss" print(dFmt.string(from: date)) } // 1984-04-01 01:00:00 

rob mayoff给出了一个不同的解决scheme ,它使date格式化程序使用中午而不是午夜作为默认date。 这里是从Objective-C到Swift的rob代码的翻译:

 let noon = DateComponents(calendar: dFmt.calendar, timeZone: dFmt.timeZone, year: 2001, month: 1, day: 1, hour: 12, minute: 0, second: 0) dFmt.defaultDate = noon.date if let date = dFmt.date(from: "1984-04-01") { dFmt.dateFormat = "yyyy-MM-dd HH:mm:ss" print(dFmt.string(from: date)) } // 1984-04-01 12:00:00