【.NET】書式を指定してDateTime(Date)の文字列を取得する
VB.NETやC#で日付型の変数から任意の書式の文字列を取得するにはDateTime(Date)構造体のToString()メソッドを使用します。
DateTimeのToString()メソッドはカルチャを明示しない場合は、実行環境の現在のカルチャに依存します。
必ず思い通りの書式で取得したい場合は、カルチャを明示する必要があります。
以下サンプルです。
現在のカルチャの書式とカルチャに依存しない書式
'VB.NETのサンプル '2006年12月6日が入った日付型の変数を作成 Dim dte As Date dte = New Date(2006, 12, 6) Dim str As String 'カルチャを指定しない(現在のカルチャに依存)で文字列化 str = dte.ToString("yyyy/MM/dd") '表示 MsgBox(str) 'IFormatProviderを指定し、 'カルチャに依存しないフォーマットで文字列化 str = _ dte.ToString("yyyy/MM/dd", _ System.Globalization.DateTimeFormatInfo.InvariantInfo) '表示 MsgBox(str)
//C#のサンプル //2006年12月6日が入った日付型の変数を作成 DateTime dte; dte = new DateTime(2006, 12, 6); string str; //カルチャを指定しない(現在のカルチャに依存)で文字列化 str = dte.ToString("yyyy/MM/dd"); //表示 MessageBox.Show(str); //IFormatProviderを指定し、 //カルチャに依存しないフォーマットで文字列化 str = dte.ToString("yyyy/MM/dd", System.Globalization.DateTimeFormatInfo.InvariantInfo); //表示 MessageBox.Show(str);
第2引数IFormatProviderのないバージョンのメソッド呼び出しでは、文字列の書式は現在のカルチャに依存した形式で出力されます。
たとえば、Windowsの”地域と言語のオプション”が和暦に指定されている環境で、実行中のスレッドのカルチャをコードで変更せずに上記のdte.ToString(“yyyy/MM/dd”)を実行した場合は、”18/12/6″(=平成18年12月6日)が出力されます。
この動作には、ユーザーの設定に合わせた結果が得られるというメリットがありますが、必ず西暦で出力されると誤解して使用すると危険です。カレンダーまで決まった形式での結果が欲しい場合は、引数IFormatProviderを指定します。
また、書式指定文字列は、大文字と小文字を区別します。たとえば、MMは”月”を意味し、mmは”分”を意味します。(VB6.0のように並びによって解釈が変わりません。)
和暦で表示させる
System.Globalization.CultureInfoのDateTimeFormatにSystem.Globalization.JapaneseCalendarのオブジェクトを指定することで、DateTime.ToString()の結果を和暦形式にすることができます。
'VB.NETのサンプル '現在のシステム日付を取得 Dim dte As Date = DateTime.Now 'CultureInfoを日本語 - 日本で作成 Dim japaneseCulture As System.Globalization.CultureInfo _ = New System.Globalization.CultureInfo("ja-JP", False) '日付の書式に和暦を指定 japaneseCulture.DateTimeFormat.Calendar _ = New System.Globalization.JapaneseCalendar() '出力(年号の書式文字列はgg) MsgBox(dte.ToString("ggyy/MM/dd", japaneseCulture))
//C#のサンプル //現在のシステム日付を取得 DateTime dte = DateTime.Now; //CultureInfoを日本語 - 日本で作成 System.Globalization.CultureInfo japaneseCulture = new System.Globalization.CultureInfo("ja-JP", false); //日付の書式に和暦を指定 japaneseCulture.DateTimeFormat.Calendar = new System.Globalization.JapaneseCalendar(); //出力(年号の書式文字列はgg) MessageBox.Show(dte.ToString("ggyy/MM/dd", japaneseCulture));
JapaneseCalendarでサポートされる年号は明治、大正、昭和、平成の4つです。
明治より前の年号が必要だったり、年号の境界に特殊なルールが必要なプログラムでは、Calendarを継承する独自のクラスを作成すると良いでしょう。
関連記事
TrackBack URL :
Comments (0)