[.NET] フィードバック - 日付を "H21/1/9" のような和暦で出力できるようにしてほしい
[提案] 日付を "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' まで試してオンメモリにテーブルを作っておく方法を、 フィードバックの 「回避策」 に投稿しました。 ここにも転記しておきます。
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 / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
この記事へのコメントは終了しました。
コメント