NSDateFormatter は、システム環境設定での設定によって決まるようで、和暦を設定されているときに適切なフォーマットを選択したり、和暦や西暦への変換に固定する方法を確認した時のメモ。
システム環境設定での設定によるフォーマット変換
NSDateFormatter のオブジェクトがもつ (NSCalendar *)calendar の (NSString *)calendarIdentifier にどのように設定されているか確認できるので、その設定によってフォーマットを変えることができる。結果、システム環境設定での設定にあった表示ができる。
NSDateFormatter *dateFormatter;
if ([dateFormatter.calendar.calendarIdentifier isEqualToString:NSJapaneseCalendar]) {
// 和暦が選択されている
dateFormatter.dateFormat = @"GGyy/MM/dd HH:mm:ss zzz";
} else {
// それ以外が選択されている
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss zzz";
}
ちなみに、yyyy 固定だと「平成25年」が “0000” と表示されてしまう。仏暦のように 2556 年とかであれば混乱がないかもしれないが、和暦だと非常に不親切。
NSDateFormatter の calendar のデフォルト
[[NSCalendar currentCalendar] isEqual:dateFormatter.calendar]
で確認すると、YES だったので、システム環境設定での設定がデフォルトの模様。(ドキュメンテーションは見つけることができていない。)
和暦(もしくは西暦)への固定
NSDateFormatter の calendar に、calendarIdentifier に NSJapaneseCalendar を設定した NSCalendar を設定することで、和暦への変換に固定できる。西暦の場合、NSGregorianCalendar 。
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSJapaneseCalendar];
dateFormatter.formatterBehavior = NSDateFormatterBehavior10_4;
dateFormatter.dateFormat = @"GGyy/MM/dd HH:mm:ss zzz";
おまけ
システム環境設定での設定変更を動的に知るには、
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(method)
name:NSCurrentLocaleDidChangeNotification
object:nil];
参考テストプログラム
参考テストプログラムを、GitHub BalunSoftware / TestNSDateFormatterOnMac にアップ。
暦法の設定が西暦の場合の結果
暦法の設定が和暦の場合の結果
暦法の設定が仏暦の場合の結果
ほかにも設定はいろいろあるので、最初に書いた判断(和暦以外は yyyy を用いるというもの)では不十分かも。
参考ドキュメント
- NSDateFormatter Class Reference 2012-09-19
- NSCalendar Class Reference 2011-06-06
- NSLocale Class Reference 2009-08-28