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

Tom*_*Tom 0 cocoa-touch objective-c nsdate ios

自今年年底以来,我有一些问题将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];
Run Code Online (Sandbox Code Playgroud)

newDateString返回2013-01-05

日期返回2014-01-05

Vik*_*ica 5

来自文档:

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

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

所以你想'yyyy'

这个"错误"也在精彩的WWDC 2011视频"Session 117 - 执行日历计算"中进行了讨论,这是任何iOS/Cocoa-Developer必看的内容.

关于ISO 8601的维基百科文章


NSDate *date = [[NSDate alloc] init];
date = [dateFormat dateFromString:newDateString];
Run Code Online (Sandbox Code Playgroud)

您创建一个NSDate,而不是创建另一个并覆盖第一个.做就是了

NSDate *date = [dateFormat dateFromString:newDateString];
Run Code Online (Sandbox Code Playgroud)