2010-12-17 2 views
10

以下のコードを参照してください。NSDateFormatter + dateFormatFromTemplate:オプション:ロケール: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

+0

ありがとうございます〜 – alforo

+0

@ughoavgfhw:ありがとうございます。私は答えの違いを指摘しておきました。なぜなら、 "Y"はほとんどの時間 "働く"ようであるので、混乱する可能性があるからです。大文字の "Y"は、あなたの日付が入っている週が何年始まるかを示します。Jan 1が木曜日にある場合、 "Y"はその週の*開始*の年を返します。 1月7日以降、「Y」は「y」と同じ結果を返しますが、最初は適切な書式設定文字を使用する方が良いでしょう。 – Anna