NSDateFormatter で、和暦の変換に固定する

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 にアップ。

暦法の設定が西暦の場合の結果

Japanese Sample

暦法の設定が和暦の場合の結果

Gregorian Sample

暦法の設定が仏暦の場合の結果

ほかにも設定はいろいろあるので、最初に書いた判断(和暦以外は yyyy を用いるというもの)では不十分かも。

Buddhist Sample

参考ドキュメント

  • NSDateFormatter Class Reference 2012-09-19
  • NSCalendar Class Reference 2011-06-06
  • NSLocale Class Reference 2009-08-28
カテゴリー: 未分類, 開発 Tips (42): Framework -- Foundation タグ: , , パーマリンク

コメントは停止中です。