NSDateFormatter 显示错误的年份

54

我正在使用带有iOS 6的xcode 4.5(4G182)。NSDateFormatter在iOS 6中显示错误的年份,如何解决?

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"YYYY-MM-dd"];
NSString *str = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"%@ == %@",str,[[dateFormatter dateFromString:str] description]);

它会打印出 "2012-09-14 == 2011-09-13 16:00:00 +0000"。


1
我不认为这是一个“iOS 6问题”。你应该使用小写字母y。请参考https://dev59.com/i1jUa4cB1Zd3GeqPQltF#6388430。 - user467105
1个回答

163

YYYY 不同于 yyyy

根据 此页面,这也是 iOS 日期格式页面 的参考资料;

`y`: Year
`Y`: Year (in "Week of Year" based calendars). This year designation is used in 
     ISO year-week calendar as defined by ISO 8601, but can be used in 
     non-Gregorian based calendar systems where week date processing is desired. 
     May not always be the same value as calendar year.
重点在最后一句话。应该使用 yyyy 代替。


关于何时以及为什么使用 YYYY 会导致年份值偏差的更多细节:

ISO 周编号年从第一周(周一)开始,到新 ISO 年之前的星期日结束(因此没有重叠或间隙)。它由 52 或 53 个完整的周组成。与传统的格里高利历年号存在偏差,在传统格里高利历年的开始时(即上一个 ISO 周编号年的结束时),它在周五、周六和周日,或周六和周日,或仅在周日进行,并且在传统的格里高利历年的结束时(即下一个 ISO 周编号年的第01周),在星期一、二和三,或星期一和星期二,或仅在星期一进行。对于星期四,ISO 周编号年号始终等于传统的格里高利历年号。

例子:

2008 年 12 月 29 日星期一写作 "2009-W01-1"

2010 年 1 月 3 日星期日写作 "2009-W53-7"

来源:https://en.wikipedia.org/wiki/ISO_8601#Week_dates (添加加粗样式)


3
谢谢,我已经为这个问题烦恼了很长时间。非常感谢。 - Vladimir Stazhilov
5
设计一个使用YYYY格式化年份的格式化程序,其中“可能不总是与日历年相同的值”,这种设计上存在一定的粗心。选择使用“QQQQ”或“XXXX”(例如)会更少出错。在这里,“助记值”似乎并不是应该优先考虑的事情。 - Spike0xff
3
我感到尴尬,拥有超过三年的iOS经验,却现在才知道!! - Hossam Ghareeb
1
谢谢,这让我疯狂了,因为2019年的12月29、30和31日显示为2020年! - Locutus
1
我在2020年12月至2021年期间遇到了这个问题... 一度以为自己疯了。 - Tristian
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接