2010-12-17 77 views
10

请参阅下面的代码和输出。NSDateFormatter + dateFormatFromTemplate:options:locale:BUG?

NSDateComponents *dateComponents = [[[NSDateComponents alloc] init] autorelease]; 
[dateComponents setYear:2011]; 
[dateComponents setMonth:1]; 
[dateComponents setDay:1]; 

NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:dateComponents]; 

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:[NSDateFormatter dateFormatFromTemplate:@"YYYYMMMd" options:0 locale:[NSLocale currentLocale]]]; 

NSString *dateString = [dateFormatter stringFromDate:date]; 

NSLog(@"Happy New Year: %@", dateString); 

您对输出的期望是什么?

Happy New Year: Jan 1, 2011 

但结果是...

Happy New Year: Jan 1, 2010 

有什么不对?请帮助...

回答

16

模板格式字符串应为@"yyyyMMMd"(年份为小写“y”)。

大写“Y”是别的东西(参见Unicode Date Format Patterns)。

+4

+1具体来说,Y是本周的年份。 2011年1月1日这一周属于2010年,所以YYYY生产2010年。 – ughoavgfhw 2010-12-17 04:58:39

+0

非常感谢〜 – alforo 2010-12-17 06:26:17

+0

@ughoavgfhw:谢谢。我应该指出答案的不同之处,因为它可能会让人困惑,因为“Y”似乎在大多数情况下“工作”。大写字母“Y”表示包含日期的那一周开始于哪一周。因此,如果1月1日是星期四,则“Y”将给出该周的开始*年(即星期一)。在1月7日或以后,“Y”会得到与“Y”相同的结果,但当然最好先使用正确的格式化信函。 – Anna 2010-12-17 13:31:45