最近のシステムでは、日付を扱う際には西暦を使用して和暦は使用しないものが増えてきました。
しかし、国や自治体に提出書類などには、西暦ではなく和暦での表示、出力が必要になりますので、そういったものを扱うシステムでは和暦での日付変換は必須になります。
そこで今回は、.NETで日付を和暦に変換、または西暦に変換する方法について紹介します。
和暦に変換する.NETのクラス
和暦に関する情報は、System.Globalization名前空間にあるJapaneseCalendarクラスを利用することで取得できます。
JapaneseCalendarクラスを使用することで和暦(元号)データを扱うことができるようになります。
JapaneseCalendarクラスは、System.Globalization名前空間にあるCalendarクラスを継承して実装されています。
1 |
public class JapaneseCalendar : System.Globalization.Calendar |
DateTime構造体から和暦(元号)を取得する
和暦に用いる元号は、JapaneseCalendarクラスのGetEraメソッドで取得することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// 以下のコードを実行するためには、System.Globalizationのusingが必要です。 public string GetEraYear(DateTime date) { string[] eras = { "明治", "大正", "昭和", "平成", "令和" }; // JapaneseCalendarクラスのインスタンスを生成します。 var japaneseCalendar = new JapaneseCalendar(); try { // DateTime構造体をもとに元号を表す番号を取得します。 var eraNumber = japaneseCalendar.GetEra(date); var eraIndex = eraNumber - 1; var era = eras[eraIndex]; // DateTime構造体をもとに年を取得します。 var year = japaneseCalendar.GetYear(date); var eraYear = $"{era}{year}年"; return eraYear; } catch { return null; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
' 以下のコードを実行するためには、System.GlobalizationのImportsが必要です。 Public Function GetEraYear(someDate As Date) As String Dim eras As String() = {"明治", "大正", "昭和", "平成", "令和"} ' JapaneseCalendarクラスのインスタンスを生成します。 Dim japaneseCalendar As JapaneseCalendar = New JapaneseCalendar() Try ' DateTime構造体をもとに元号を表す番号を取得します。 Dim eraNumber As String = japaneseCalendar.GetEra(someDate) Dim eraIndex As Integer = eraNumber - 1 Dim era As String = eras(eraIndex) ' DateTime構造体をもとに年を取得します。 Dim year As Integer = japaneseCalendar.GetYear(someDate) Dim eraYear As String = $"{era}{year}年" Return eraYear Catch Return Nothing End Try End Function |
ここでは、GetEraYearというメソッドを作成して、和暦年(元号付きの年)の文字列を生成して返しています。
.NETで取得できる元号は明治から令和の範囲になります。
各元号の開始日と終了日は、次のようになります。
各元号の開始日~終了日
明治
1868年9月8日 ~ 1912年7月29日
大正
1912年7月30日 ~ 1926年12月24日
昭和
1926年12月25日 ~ 1989年1月7日
平成
1989年1月8日 ~ 2019年4月30日
令和
2019年5月1日 ~ 9999年12月31日
DateTime構造体を和暦の日付文字列に変換する
DateTime構造体を和暦の日付文字列に変換するには、JapaneseCalendarクラスに加えて、JapaneseCalendarクラスと同じ名前空間のSystem.GlobalizationにあるCultureInfoクラスを使用します。
CultureInfoクラスは、各地域の文化情報を操作するためのクラスです。
日本の情報を得るためには、CultureInfoクラスのコンストラクタに「ja-JP」を指定してインスタンスを生成します。
1 |
CultureInfo cultureInfo = new CultureInfo("ja-JP", true); |
生成したCultureInfoクラスのインスタンスのカレンダーに
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 以下のコードを実行するためには、System.Globalizationのusingが必要です。 public string ConvertToEraDate(DateTime date) { // CultureInfoクラスのインスタンスを生成します。 var cultureInfo = new CultureInfo("ja-JP", true); // 生成したインスタンスのカレンダーにJapaneseCalendarクラスのインスタンスを設定します。 cultureInfo.DateTimeFormat.Calendar = new JapaneseCalendar(); try { // CultureInfoを指定してDateTime構造体から和暦の日付文字列に変換します。 var eraDate = date.ToString("ggyy年M月d日", cultureInfo); return eraDate; } catch { return null; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
' 以下のコードを実行するためには、System.GlobalizationのImportsが必要です。 Public Function ConvertToEraDate(someDate As Date) As String ' CultureInfoクラスのインスタンスを生成します。 Dim cultureInfo As CultureInfo = New CultureInfo("ja-JP", True) ' 生成したインスタンスのカレンダーにJapaneseCalendarクラスのインスタンスを設定します。 cultureInfo.DateTimeFormat.Calendar = New JapaneseCalendar() Try ' CultureInfoを指定してDateTime構造体から和暦の日付文字列に変換します。 Dim eraDate As String = someDate.ToString("ggyy年M月d日", cultureInfo) Return eraDate Catch ex As Exception Return Nothing End Try End Function |
DateTime構造体をToStringメソッドで文字列に変換する際に、CultureInfoクラスのインスタンスを引数指定することで和暦日付に変換することができます。
CultureInfoクラスとJapaneseCalendarクラスを使用することで、和暦日付の文字列をDateTime構造体に変換することもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 以下のコードを実行するためには、System.Globalizationのusingが必要です。 public DateTime? ConvertFromEraDate(string eraDate) { // CultureInfoクラスのインスタンスを生成します。 var cultureInfo = new CultureInfo("ja-JP", true); // 生成したインスタンスのカレンダーにJapaneseCalendarクラスのインスタンスを設定します。 cultureInfo.DateTimeFormat.Calendar = new JapaneseCalendar(); // DateTime構造体への変換を試みます。 var canParce = DateTime.TryParseExact( eraDate, "ggyy年M月d日", cultureInfo, DateTimeStyles.AssumeLocal, out DateTime result); if (canParce) { return result; } else { return null; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
' 以下のコードを実行するためには、System.GlobalizationのImportsが必要です。 Public Function ConvertFromEraDate(eraDate As String) As Date? ' CultureInfoクラスのインスタンスを生成します。 Dim cultureInfo As CultureInfo = New CultureInfo("ja-JP", True) ' 生成したインスタンスのカレンダーにJapaneseCalendarクラスのインスタンスを設定します。 cultureInfo.DateTimeFormat.Calendar = New JapaneseCalendar() Dim result As Date ' DateTime構造体への変換を試みます。 Dim canParse = Date.TryParseExact( eraDate, "ggyy年M月d日", cultureInfo, DateTimeStyles.AssumeLocal, result) If (canParse) Then Return result Else Return Nothing End If End Function |
和暦日付の文字列をDateTime構造体に変換する際は、DateTime構造体のTryParseExactメソッドを使用します。