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