自今年年底以来,我在将NSString转换为NSDate时遇到了一些问题。代码之前一直很好用,但它突然开始表现得很糟糕......
例如2013-01-05在转换为NSDate时成为2014-01-05。
因为它整整一年都不觉得时区令人不快。
2012年的日期并没有这样做。
有人知道可能出现的问题吗?
代码: NSString * dateString = postInfo.noteDate; 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
答案 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;
}