和暦の略称をフレームワークでゲットできると思った?

和暦を扱うのは、CultureInfo  クラスを使うとできるのだが、「H」のような略称をゲットできるメソッドはないらしい。平成がそろそろ終わるわけで、真面目に考えておかないと怖いことになるかも。ソフトで和暦を使わなければよいのだけど、現実で使われているからなあ。(2017/10/5追記)


ということで、略称は自分で用意するしかない。

using System.Globalization;

CultureInfo ci = CultureInfo.CreateSpecificCulture("ja-JP");
JapaneseCalendar ja = new JapaneseCalendar();
ci.DateTimeFormat.Calendar = ja;

DateTime dt = DateTime.Now;  // 2016年だと

string s = string.Format(ci, "{0:gyy}", dt);   // 「平成28」が得られる

Dictionary<int,string> di年号の略称 = new Dictionary<int string="">()
{
    { 1, "M" },
    { 2, "T" },
    { 3, "S" },
    { 4, "H" },
};
string s2 = string.Format(ci, "{0}{1:yy}", di年号の略称[ja.GetEra(dt)], dt);   // H28


平成が終わって次の年号になると GetEra メソッドは5を返すことになって、上のコードは例外を起こすわけだ。

参考リンク


それにしても、CultureInfo クラスの世界中の習慣を扱う仕組みが恐ろしく汎用的で素晴らしいのだけど、これで本当にカバーできるのかな?


和暦マスタ(2017/10/5追記)

MSDNに和暦マスタが紹介されていた。レジストリに登録されているらしい。

Era Handling for the Japanese Calendar

これを使えば、和暦の略称もゲットできるけど、これはFrameworkを使わずに自前で実装しろということ?

和暦の略称をゲットするGetAbbreviatedEraName (2017/10/5追記)

このメソッドを使えばいけるのか?と思ったら、、、日本語の1文字目が得られるのだった。惜しい、、、

string s3 = ci.DateTimeFormat.GetEraName(3);     // 「昭和」
string s4 = ci.DateTimeFormat.GetAbbreviatedEraName(3);     // 「昭」 うーん



HTMLも時間がたってソースコードを表示するタグが追加されたりしたかなと期待して調べてみたが、今でも<などの記号はエスケープしないといけないらしい。面倒くさいなあ。


コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。