2016-01-20 42 views
-1

我有一个场景,我得到日期字符串为“46-05-24”(yy-mm-dd),而且我需要将日期重新格式化为“1946-05-24”。 NSDateFormatter将该字符串解释为“2046-05-24”。NSDateFormatter解析两位数的年份为2046而不是1946或2040而不是1940

我使用这个代码:

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) 
    } 

有我丢失的东西吗?

+1

在解析它之前,你是否尝试过仅在字符串前加上'19'? – luk2302

+0

我从文档扫描的日期 –

+0

正如您有日期:'46 -05-24'。因此,按照时间戳规则,它从1970年开始。因此,可能将当前的世纪2000作为默认值 –

回答

0

您问题的原因是您的数据忽略了一些相关信息:世纪。只使用最后两位数字作为开发者必须决定日期是在哪个世纪。如果他们全部都在20世纪(1900 - 1999年),您可以使用以下方法:

您可以简单地加上19在解析字符串之前。假设date是要解析字符串,你可以使用

let dateFromString = dateFormatter.dateFromString("19" + (date as String)) 

,而不是你

let dateFromString = dateFormatter.dateFromString(date as String) 

如果你要处理的日期是20,你是要到21世纪因为哪一年是05应该反映出来,所以时间不好? 1905年? 2005年? 2105?

+0

如果年份是2千,那么现在的世纪呢? – raki

+2

@raki那么OP将会有一段糟糕的时间,因为'05'例如不是确定性可解析的--1905或2005?。只使用2年的数字会让你陷入麻烦,因为你丢失了一些信息。使用我的代码,他会得到他要求的确切结果:20世纪的日期! – luk2302

+0

我从扫描护照时得到日期,所以有类似tat的情况。 :( –

3

这是因为如果你给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 

当然,如果你找人,其日期是在100多年前,有没有什么好办法对你的代码要知道哪一年是适当的。如果年份是“10”,那么1910年或2010年出生的人是谁?你无法知道,你所有的代码都可以做出最好的猜测。

相关问题