読者です 読者をやめる 読者になる 読者になる

24/7 twenty-four seven

iOS/OS X application programing topics.

日本語環境では、NSDateFormatterでフォーマットした日付がおかしい

iPhone Objective-C Cocoa

書式文字列の仕様は以下の通りです。

h Hour [1-12]
H Hour [0-23]
K Hour [0-11]
k Hour [1-24]
UTS #35: Locale Data Markup Language

それでこんなコードで実験してみると・・・

NSDate *now = [[NSDate date] retain];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[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);


こうなります。

書式 24時間表示 ON 24時間表示 OFF
hh 22:00:57 10:00:57
00:06:27 12:06:27
HH 22:00:57 午後10:00:57
00:06:27 午前12:06:27
KK 22:00:57 10:00:57
24:06:27 00:06:27
kk 22:00:57 24:06:27
午後10:00:57 午前00:06:27


「午前」「午後」という文字列が混ざるのもダメですが、iPhone本体の設定に関わらず、まともに24時間表記が返ってくるものが1つもありません。
ていうか"hh"と"HH"、"KK"と"kk"の対応がおかしい。
そもそも"HH"は24時間表記が返ってくるのではないのか。


仕方が無いので、LocaleをUSに設定して使っています。

[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"US"] autorelease]];
書式 24時間表示 ON 24時間表示 OFF
hh 10:00:57 10:00:57
12:06:27 12:06:27
HH 22:00:57 22:00:57
00:06:27 00:06:27
KK 10:00:57 10:00:57
00:06:27 00:06:27
kk 22:00:57 22:00:57
24:06:27 24:06:27

この結果は、間違いなく正しい。