.NETと日付の何とも言えない制限

2013 年 10 月 15 日 by 山平

.NETのDatetimePickerを継承して、年を和暦で表示するWarekiDatetimePickerを作ろうとしたときの記録です。

和暦表示は需要があるようで、すぐに情報が見つかりました。

  • DateTimePickerで和暦を表示させる方法 – MSDN – Microsoft
    この方法、パッと見はいい感じですが、年をキー入力できず、さらにカレンダーを開くと西暦表示のままです。
    ここを修正するのは手間なのか情報が見つかりませんが、本題と外れるので深追いしません。

実装して試していると、時々変な例外で落ちます。

追加情報: 指定された時刻はこのカレンダーではサポートされていません。
値は 09/08/1868 00:00:00 (グレゴリオ暦) から 12/31/9999 23:59:59 (グレゴリオ暦) までの間でなければなりません。

「このカレンダー」の部分はDatetimePickerのカレンダー表示部分だと思うのですが、DatetimePickerの限界値と異なっているのが気になります。
DatetimePickerの限界値は、MinimumDateTimeプロパティ、MaximumDateTimeプロパティで確認できます。

[VB]
DateTimePicker.MinimumDateTime ‘ ⇒ #1/1/1753#
DateTimePicker.MaximumDateTime ‘ ⇒ #12/31/9998#
[/VB]

じゃあ、「このカレンダー」の部分はDatetimePickerのValue(DateTime型)?
違う気がしつつも確認します。

[VB]
DateTime.MinValue ‘ ⇒ #12:00:00 AM#
DateTime.MaxValue ‘ ⇒ #12/31/9999 11:59:59 PM#
[/VB]

となると、残るカレンダーはあと一つ。
和暦表示するためのフォーマット変換で使っている部分です。

[VB]
Dim date As Date = Date.Now
Dim calendar As New System.Globalization.JapaneseCalendar() ‘ <=このカレンダー
Dim culture As New System.Globalization.CultureInfo(“ja-JP”)
culture.DateTimeFormat.Calendar = calendar
Console.WriteLine(date.ToString(“ggyy年MM/dd”, culture))
[/VB]

このクラスはMeiji 1日の9年1月8日処理します (グレゴリオ暦、1868年1月9日8)。

機械翻訳が変なので原文の翻訳を試みます。

This class handles dates from September 8 in the year Meiji 1 (in the Gregorian calendar, September 8, 1868).

(意訳)このクラス(JapaneseCalendar)は(グレゴリオ暦の1868年9月8日にあたる)明治元年9月8日以降の日付を操作します。

明治元年より前には対応していないのが原因のようです。
当然ですが未来の元号は定義されていないため、「平成100年」なんて表示になります。

以上です。

タグ: ,

TrackBack