无法从此特定日期(1994-04-01)字符串转换为NSDate

0 nsdateformatter ios

奇怪的事发生在我身上.我无法转换此特定日期(1994-04-01)字符串.任何人都可以检查这个并让我知道它是否在您的代码中重现?

重现步骤:

迅速:-

let dateString = "1994-04-01"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateFromString = dateFormatter.date(from: dateString)
Run Code Online (Sandbox Code Playgroud)

对象: -

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSString *birthdayStr = @"1994-04-01";
NSDate *birthday = [formatter dateFromString:birthdayStr];
Run Code Online (Sandbox Code Playgroud)

预期成绩:

birthday = 1994-03-31 21:00:00 +0000
Run Code Online (Sandbox Code Playgroud)

在UTC中

实际结果:

birthday = nil
Run Code Online (Sandbox Code Playgroud)

版:

Xcode ver: - 版本8.1(8B62)

OS X ver: - 10.12.1(16B2555)

你可以尝试任何不同的日期(1994-04-01),它会工作正常.

rob*_*off 7

测试代码:

import Foundation

for timeZoneId in TimeZone.knownTimeZoneIdentifiers {
    let dateString = "1994-04-01"
    let dateFormatter = DateFormatter()
    dateFormatter.timeZone = TimeZone(identifier: timeZoneId)
    dateFormatter.dateFormat = "yyyy-MM-dd"
    if dateFormatter.date(from: dateString) == nil {
        print(timeZoneId)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Asia/Amman
Asia/Damascus
Asia/Gaza
Asia/Hebron
Asia/Jerusalem
Run Code Online (Sandbox Code Playgroud)

我总结您的系统时区设置为打印的时区之一.如果我在谷歌输入"耶路撒冷时区1994",第一个结果告诉我,夏令时从1994年4月1日的午夜开始.这意味着没有午夜.1994年4月1日的第一个时刻实际上是该时区的凌晨1点.

DateFormatter当没有从字符串中解析时间时,A 默认使用午夜时间.这使得它在字符串中的日期不存在午夜时失败.

解决方案是不使用午夜作为您的默认时间.中午是一个更安全的默认时间.因此,一种解决方案是在输入中包含时间并以以下格式解析:

    let dateString = "1994-04-01 12:00:00"
    let dateFormatter = DateFormatter()
    dateFormatter.timeZone = TimeZone(identifier: timeZoneId)
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是为日期格式化程序提供某天中午的默认日期:

    // Reference date was 00:00:00 UTC on 1 January 2001. This is noon of the same day in UTC.
    dateFormatter.defaultDate = Date(timeIntervalSinceReferenceDate: 12*60*60)
Run Code Online (Sandbox Code Playgroud)

如果您要在iOS或macOS上进行任何日期解析或操作,那么观看WWDC 2013 Session 227:解决常见日期和时间挑战将是一个非常好的主意.