2010-12-17 55 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