NSDateFormatter 将两位数年份解析为 2046 而不是 1946 或 2040 而不是 1940

Ani*_*nto 0 cocoa-touch nsdateformatter date-parsing ios

我有一个场景,我得到的日期字符串为“46-05-24”(yy-mm-dd),并且我需要将日期重新格式化为“1946-05-24”。将NSDateFormatter字符串解释为“2046-05-24”。

我正在使用这段代码:

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yy-mm-dd"
    let gmt : NSTimeZone = NSTimeZone(abbreviation: "GMT")!
    dateFormatter.timeZone = gmt
    let dateFromString = dateFormatter.dateFromString(date as String)
    dateFormatter.dateFormat = "yyyy-mm-dd"
    if dateFromString != nil{
        let dateString = dateFormatter.stringFromDate(dateFromString!)
        print(dateString)
    }
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么吗?

Tom*_*ton 5

发生这种情况是因为,如果您给出NSDateFormatter两位数的年份,它需要确定该年份所在的世纪。它使用其twoDigitStartDate属性来执行此操作,该属性设置两位数年份可以表示的最早日期。它的默认值为 1949 年 12 月 31 日。46 中的日期低于 50 的日期,因此它被视为 2046。

您可以更改 的值twoDigitStartDate来调整结果。例如,您可以将其设置为 100 年前的日期。这意味着任何两位数年份都将被解释为具有这两位数的最近年份:

let oneCenturyAgo = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.Year, value: -100, toDate: NSDate(), options: NSCalendarOptions(rawValue:0))
dateFormatter.twoDigitStartDate = oneCenturyAgo
Run Code Online (Sandbox Code Playgroud)

当然,如果您得到的日期超过 100 年前,您的代码就没有什么好办法知道哪一年是合适的。如果年份是“10”,那么这个人是 1910 年出生还是 2010 年出生?您无从得知,您的代码所能做的就是做出最佳猜测。