我发现DateFormatter date(from:)
方法无法解析几个特定日期。方法在1981 - 1984年的第一个月返回nil
。这是基金会的错误吗?我们可以做些什么来解析这些日期?
答案 0 :(得分:17)
如果夏令时正好启动,则会出现此问题 午夜,就像1981 - 1984年莫斯科的情况一样(例如见Clock Changes in Moscow, Russia (Moskva))。
在
中也观察到了这一点例如,在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提供,这是为了使日期格式化程序使用中午而不是午夜作为 默认日期。以下是从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