我发现DateFormatterdate(from:)方法不能解析几个特定的日期。方法返回1981-1984年4月1日的nil。是粉底虫吗?我们可以做些什么来解析这些日期?
Xcode 8.0,iOS SDK 10.0。下面是一个简短的操场示例的屏幕截图:
ios - 80s的1月1日在iOS 10.0中无法解析-LMLPHP

最佳答案

如果夏令时正好开始,则会出现此问题
午夜,就像1981-1984年莫斯科的情况一样(参见Clock Changes in Moscow, Russia (Moskva))。
这在
Why does NSDateFormatter return nil date for these 4 time zones?
Why NSDateFormatter is returning null for a 19/10/2014 in a Brazilian time zone?
例如,1984年4月1日午夜,时钟向前调整了一小时,这意味着日期“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

作为解决方案,您可以告诉日期格式化程序“宽大”:
dFmt.isLenient = true

然后返回当天的第一个有效日期:
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

A different solution
是由rob mayoff给出的,它使日期格式化程序使用中午而不是午夜作为
默认日期。以下是rob代码从Objective-C到Swift的翻译:
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

07-27 15:19