« [Windows7] βがこんなに速くていいのか!? f(^^; | トップページ | [Windows7] 一般向けのβ版ダウンロードにアクセス殺到? ただいま閉店中 → 再開してます ( 11日 ) »

2009年1月10日 (土)

[.NET] フィードバック - 日付を "H21/1/9" のような和暦で出力できるようにしてほしい

MS Connect: ID 392977

[提案] 日付を "H21/1/9" のような和暦で出力できるようにしてほしい

DateTime.ToString() や String.Format() などを使って DateTime 型のフォーマットをするときに、 "平成21年1月9日" というフォーマットはサポートされていますが、 日本でよく使われるもう一つのフォーマット "H21/1/9" はサポートされていません。
そのため日本の開発者は、 データベース上にテーブルを持ったり、 非公開なプロパティにアクセスしたりといった、余計な機能を作りこんでアプリケーションを書いています。 この 「元号の頭文字をアルファベットで表記する」 というフォーマットでの出力を、なんとかサポートして欲しいです。

MSDN フォーラム ( 日本 ) Visual Basic フォーラム での議論も、 参照してください。

これはまぁ、 個人的には、 Parse と Format が非対称になっちゃってるのが美しくない、 ってことです。

アプリケーションの起動時に、 'A' ~ 'Z' まで試してオンメモリにテーブルを作ってしまえば、 後はそれを使って西暦→元号の変換をしてくれるモノを用意しておくだけです。 ( このときは、 西暦 - 和暦の対応関係は、 すべて .NET Framework に依存することになる。 )
あるいは、 西暦 - 和暦 双方向の変換をするためのテーブルを用意して、 すべて自前で変換する場合もあるでしょう。 ( このときは、 西暦 - 和暦の対応関係は、 すべて自前で管理することになる。 業務アプリでは、 けっこう多い。 )

ところが世の中には…
元号を含む和暦→西暦の変換と、 西暦から和暦の年月日の変換は .NET Framework に依存しておきながら、 西暦→元号の変換だけ自前でテーブルを用意している、 という不思議な構造のアプリが存在したりします。
# ほんとですよ。 VB から .NET Framework に移植する仕事で、 それを見てびっくりしましたけど。 f(^^;

そういうのを見てしまうと、 やっぱりこれは、 Parse() と Format() が対称になってるべきだよなぁ、 と思うわけです。


# 平成の次の元号の頭文字… よもや S とか T とか M とかにしてくれるなよ~ f(^^;

 

( 2009/1/10 追記 )
'A' ~ 'Z' まで試してオンメモリにテーブルを作っておく方法を、 フィードバックの 「回避策」 に投稿しました。 ここにも転記しておきます。

フィードバックの回避策 392977

private System.Collections.Generic.Dictionary<int, string> _eraTable
    = new System.Collections.Generic.Dictionary<int, string>();

private System.Globalization.Calendar _calendar = new System.Globalization.JapaneseCalendar();
private System.Globalization.CultureInfo _culture = new System.Globalization.CultureInfo("ja-JP");

public void SetupEraTable() {
    this._culture.DateTimeFormat.Calendar = this._calendar;    //普通はコンストラクタに置く。

    for (char e = 'A'; e <= 'Z'; e++) {
        int eraIndex = this._culture.DateTimeFormat.GetEra(e.ToString());
        if (eraIndex > 0) {
            this._eraTable.Add(eraIndex, e.ToString());
        }
    }
}

public string GetAbbreviatedEnglishEraName(DateTime dt) {
    int eraIndex = this._calendar.GetEra(dt);
    string e;
    this._eraTable.TryGetValue(eraIndex, out e);
    return e;
}



[TestMethod()]
public void GetEraTest() {
    SetupEraTable();
    Assert.AreEqual<int>(4, this._eraTable.Count);

    Assert.AreEqual<string>("H", GetAbbreviatedEnglishEraName(new DateTime(2009, 1, 10)));
    Assert.AreEqual<string>("H", GetAbbreviatedEnglishEraName(new DateTime(1989, 1, 8)));
    Assert.AreEqual<string>("S", GetAbbreviatedEnglishEraName(new DateTime(1989, 1, 7)));

    Assert.AreEqual<string>("S", GetAbbreviatedEnglishEraName(new DateTime(1926, 12, 25)));
    Assert.AreEqual<string>("T", GetAbbreviatedEnglishEraName(new DateTime(1926, 12, 24)));

    Assert.AreEqual<string>("T", GetAbbreviatedEnglishEraName(new DateTime(1912, 7, 30)));
    Assert.AreEqual<string>("M", GetAbbreviatedEnglishEraName(new DateTime(1912, 7, 29)));

    Assert.AreEqual<string>("M", GetAbbreviatedEnglishEraName(new DateTime(1868, 1, 25)));
    Assert.AreEqual<string>("M", GetAbbreviatedEnglishEraName(new DateTime(1868, 1, 1))); // これは嘘。 当時は旧暦だったので、 1868/1/25 が M1/1/1 に当たる。

    try {
        GetAbbreviatedEnglishEraName(new DateTime(1867, 12, 31));
    }
    catch (ArgumentOutOfRangeException) {    //: 指定された引数は、有効な値の範囲内にありません。パラメータ名: 時間値が年号の範囲を超えています。。
        // ( OK! )
    }
}

で。 DateTimeFormat.GetEra() を 'A' ~ 'Z' まで試してますが、 これはいかにもカッコ悪いです。
じつは、 DateTimeFormatInfo クラスが string[] を返す AbbreviatedEnglishEraNames プロパティを持ってまして、 これが使えれば変換テーブルもサックリ作れるのですが… このプロパティは private なんです。

|

« [Windows7] βがこんなに速くていいのか!? f(^^; | トップページ | [Windows7] 一般向けのβ版ダウンロードにアクセス殺到? ただいま閉店中 → 再開してます ( 11日 ) »

プログラミング」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [.NET] フィードバック - 日付を "H21/1/9" のような和暦で出力できるようにしてほしい:

» [.NET] (続) フィードバック - 日付を "H21/1/9" のような和暦で出力できるようにしてほしい [biac の それさえもおそらくは幸せな日々@nifty]
DateTime.ToString() などのフォーマットとして、 H21/1/9 みたいに元号の頭文字もサポートしてよ、 と MS Connect でお願いしていました。 その回答が今日ありました。 this is a good idea. However, this feature request requires... [続きを読む]

受信: 2009年3月26日 (木) 18時20分

« [Windows7] βがこんなに速くていいのか!? f(^^; | トップページ | [Windows7] 一般向けのβ版ダウンロードにアクセス殺到? ただいま閉店中 → 再開してます ( 11日 ) »