在某些情况下,将NSString转换为NSDate会增加一年

时间:2013-01-06 17:17:45

标签: objective-c ios cocoa-touch nsdate

自今年年底以来,我在将NSString转换为NSDate时遇到了一些问题。代码之前一直很好用,但它突然开始表现得很糟糕......

例如2013-01-05在转换为NSDate时成为2014-01-05。

因为它整整一年都不觉得时区令人不快。

2012年的日期并没有这样做。

有人知道可能出现的问题吗?

代码:         NSString * dateString = postInfo.no​​teDate;         NSString * newDateString = [dateString substringToIndex:10];

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"YYYY-MM-dd"]; 
    NSDate *date = [[NSDate alloc] init];
    date = [dateFormat dateFromString:newDateString];

newDateString返回2013-01-05

日期返回2014-01-05

4 个答案:

答案 0 :(得分:5)

来自docs

  

Y 1..n 1997年(以“年度周”为基础的日历)。通常,长度指定填充,但对于两个字母,它还指定最大长度。今年的指定用于ISO 8601定义的ISO年 - 周日历,但可用于需要周日处理的非基于格里高利的日历系统。可能并不总是与日历年相同的值。

     

y 1..n 1996年。通常,长度指定填充,但对于两个字母,它还指定最大长度。

所以你想'yyyy'

这个'bug'也在精彩的WWDC 2011 Video "Session 117 - Performing Calendar Calculations"中进行了讨论,对于任何iOS / Cocoa-Developer来说都是必看的。

关于ISO 8601的维基百科文章


NSDate *date = [[NSDate alloc] init];
date = [dateFormat dateFromString:newDateString];

您创建一个NSDate而不是创建另一个并覆盖第一个。只是做

NSDate *date = [dateFormat dateFromString:newDateString];

答案 1 :(得分:3)

使用yyyy的年份不是YYYY,它给出了一周的年份。见ISO标准。

答案 2 :(得分:3)

用小写字母表示yyyy,YYYY是另一回事:

  

年份("年度周"基于日历)。今年的指定用于ISO 8601定义的ISO年 - 周日历,但可用于需要周日处理的非基于格里高利的日历系统。可能并不总是与日历年相同的值。

请参阅http://www.unicode.org/reports/tr35/tr35-19.html#Date_Format_Patterns

答案 3 :(得分:0)

我希望这会对你有所帮助。试试这个

 - (NSDate*) dateFromString:(NSString*)aStr
    {

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];

        [dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss a"];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

        NSLog(@"%@", aStr);
        NSDate   *aDate = [dateFormatter dateFromString:aStr];
        [dateFormatter release];
        return aDate;
    }