2009年5月1日金曜日

.NET 西暦と和暦を変換するには

西暦から和暦に変換するには



2009年05月01日を平成21年05月01日に変換するには、JapaneseCalendarクラス(System.Globalization名前空間)を使用します。
Dim culture As New System.Globalization.CultureInfo("ja-JP", True)
culture.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar()

Dim target As DateTime = New DateTime(2009,5,1)
Console.WriteLine(target.ToString("ggyy年MM月dd日", culture))
'出力:平成21年05月01日



2009年05月01日をH21年05月01日に変換するには、JapaneseCalendarクラスのAbbreviatedEnglishEraNamesプロパティにリフレクションを利用してアクセスすることで変換できます。
これは、.NET Frameworkでは推奨されていないプロパティに対するアクセスなので、今後.NET Frameworkがバージョンアップすることで利用できなくなる可能性があることを留意しましょう。
Dim target As DateTime = New DateTime(2009, 5, 1)

Dim culture As New System.Globalization.CultureInfo("ja-JP", True)
Dim calendar As New System.Globalization.JapaneseCalendar()
Dim formatInfo As System.Globalization.DateTimeFormatInfo
formatInfo = culture.DateTimeFormat
formatInfo.Calendar = calendar

Dim t As Type = formatInfo.GetType
Dim pi As System.Reflection.PropertyInfo
pi = t.GetProperty("AbbreviatedEnglishEraNames", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim eraNames() As String = CType(pi.GetValue(formatInfo, Nothing), String())
Dim era As Integer = formatInfo.Calendar.GetEra(target)
Dim eraName As String = eraNames(era - 1)

Console.WriteLine(eraName & target.ToString("yy年MM月dd日", culture))
'出力:H21年05月01日  



JapaneseCalendarクラスのGetEraメソッドは、指定された日付時刻が示す元号を取得できます。
結果は1が明治、2が大正、3が昭和、4が平成となります。

JapaneseCalendarクラスの
AbbreviatedEnglishEraNamesプロパティは、和暦のアルファベット略称(平成はH、昭和はSなど)を取得できます。
AbbreviatedEraNamesプロパティは、和暦の略称(平成は平、昭和は昭など)を取得できます。
EraNamesプロパティは、和暦の漢字(平成、昭和など)を取得できます。


和暦から西暦に変換するには



平成21年05月01日を2009年05月01日に変換するには、JapaneseCalendarクラス(System.Globalization名前空間)を使用します。
Dim target As String = "平成21年05月01日"

Dim culture As New System.Globalization.CultureInfo("ja-JP", True)
culture.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar()
Dim result As DateTime = DateTime.ParseExact(target, "ggyy年MM月dd日", culture)

Console.WriteLine(result.ToString)
'出力:2009/05/01 0:00:00


H21年05月01日を2009年05月01日に変換するには、「H」を「平成」に置換したのち、変換します。
Dim target As String = "H21年05月01日"

Dim culture As New System.Globalization.CultureInfo("ja-JP", True)
Dim calendar As New System.Globalization.JapaneseCalendar()
Dim formatInfo As System.Globalization.DateTimeFormatInfo
formatInfo = culture.DateTimeFormat
formatInfo.Calendar = calendar

Dim t As Type = formatInfo.GetType
Dim pi As System.Reflection.PropertyInfo

pi = t.GetProperty("EraNames", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim eraNames() As String = CType(pi.GetValue(formatInfo, Nothing), String())

pi = t.GetProperty("AbbreviatedEnglishEraNames", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim abbrevEnglishEraNames() As String = CType(pi.GetValue(formatInfo, Nothing), String())

For idx As Integer = 0 To abbrevEnglishEraNames.Length - 1
If target.Contains(abbrevEnglishEraNames(idx)) Then
target = target.Replace(abbrevEnglishEraNames(idx), eraNames(idx))
Exit For
End If
Next

Dim result As DateTime = DateTime.ParseExact(target, "ggyy年MM月dd日", culture)
Console.WriteLine(result.ToString)
'出力:2009/05/01 0:00:00

0 件のコメント: