在某些情况下,将NSString转换为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

date收益2014-01-05

从文档 :

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

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

所以你想'yyyy'

WWDC 2011video“Session 117 – 执行日历计算”中也讨论了这个“bug ” ,这是任何iOS / Cocoa开发者都必须看到的。

维基百科有关ISO 8601的文章


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

你创build一个NSDate,然后创build另一个并覆盖第一个。 做就是了

 NSDate *date = [dateFormat dateFromString:newDateString]; 

使用YYYY年,而不是YYYY,这给了周年。 见ISO标准。

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

年份(以“每周”为基础的日历)。 今年指定用于ISO 8601定义的ISO年历,但可用于需要星期处理的非格里历日历系统。 可能并不总是与历年相同的价值。

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

我希望这会帮助你。 尝试这个

  - (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; }