日本語環境では、NSDateFormatterでフォーマットした日付がおかしい - 24/7 twenty-four seven
前に日本語環境ではフォーマットした時刻の表記に「午前・午後」が含まれてしまって使いにくいと書いたのですが、コメントにて、フォーマットする前にロケール(NSLocale)を設定すると良いと教えていただいたので、試してみました。
日本語だとおかしい、というより、locale を設定していないとだめみたいです。ja_JP を setLocale で設定すればちゃんと値が返ってきます。
日本語環境では、NSDateFormatterでフォーマットした日付がおかしい - 24/7 twenty-four seven]
前回と同じコードにロケールを設定するコードを追加して、実験してみました。
NSDate *now = [[NSDate date] retain]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //ロケールを設定 [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease]]; [dateFormatter setDateFormat:@"hh:mm:ss"]; NSString *formattedDate = [dateFormatter stringFromDate:now]; NSLog(@"%@", formattedDate); [dateFormatter setDateFormat:@"HH:mm:ss"]; formattedDate = [dateFormatter stringFromDate:now]; NSLog(@"%@", formattedDate); [dateFormatter setDateFormat:@"KK:mm:ss"]; formattedDate = [dateFormatter stringFromDate:now]; NSLog(@"%@", formattedDate); [dateFormatter setDateFormat:@"kk:mm:ss"]; formattedDate = [dateFormatter stringFromDate:now]; NSLog(@"%@", formattedDate);
2009-04-19 20:48:25.665 DateTest[3173:20b] 08:48:25 2009-04-19 20:48:25.671 DateTest[3173:20b] 20:48:25 2009-04-19 20:48:25.676 DateTest[3173:20b] 08:48:25 2009-04-19 20:48:25.682 DateTest[3173:20b] 20:48:25
確かに、まともな形式で返ってきます。
とすると、dateFormatterのlocaleは初期値として何が入っているのでしょうか?
調べてみました。
NSLog(@"%@", [dateFormatter locale]); NSLog(@"%@", [NSLocale currentLocale]); NSLog(@"%@", [NSLocale systemLocale]);
結果は次のように出力されました。
2009-04-19 21:36:21.287 DateTest[3385:20b] <NSCFLocale: 0x1178c0> 2009-04-19 21:36:21.295 DateTest[3385:20b] <NSCFLocale: 0x117050> 2009-04-19 21:36:21.306 DateTest[3385:20b] <NSCFLocale: 0x1178c0>
どうやら、インスタンス化した直後のdateFormatterにはcurrentLocaleが設定されているようです。
先述のdateFormatterに設定するロケールは、sysytemLocaleでもOKでした。