2008/03/15
というような西暦の日付を、
平成20年3月15日(土)
といような形式でデータが欲しいので挑戦してみた。他のサイトを見てみるとformat関数で西暦から和暦に変換というのが検索エンジンで沢山でてきたので簡単にできるだろうとタカをくくっていたら、いや、できないんだけど・・・。Format(Now,”gggyy年MM月”)で一発変換というようなことをどこのサイトを見ても書いているので真似してやってみたら西暦08年とかわけのわからない数字を返してくれてどっと疲れた。仕方がないので地道に変換をしてみることにする。
とりあえず手がかりとして見つかったのはJapaneseCalendarクラスのgetEraメソッド(ゲッテラメソッド)を使うと元号のようなものを取得できるらしいとのこと。System.Globalization.JapaneseCalendar をimportsすると使えるようになる模様。2008を平成20年という形式でデータが欲しいため、下記のgetGengoYear関数を作成してみた。date型のパラメータを渡して呼ぶと文字列型の元号プラス年で返してくれる。
元号を返してくれる関数:getGengoYear関数
Private Function getGengoYear(ByVal targetDate As Date) As String
'これに元号を入れる
Dim gengo As String
'これに和暦の年を入れる
Dim targetGengoYear As String
'JapaneseCalendarクラスのインスタンス化
Dim jpCal As Globalization.JapaneseCalendar = New Globalization.JapaneseCalendar
'パラメータの日付から元号を判断する
Select Case jpCal.GetEra(targetDate)
Case 1
gengo = "明治"
Case 2
gengo = "大正"
Case 3
gengo = "昭和"
Case Else
gengo = "平成"
End Select
'元号と和暦の年とをくっつける
targetGengoYear = gengo & jpCal.GetYear(targetDate) & "年"
'出来上がった元号プラス和暦年を返す
Return targetGengoYear
End Function
これで難関の元号を取得することができた。次は3月15日(土)の部分。さっき作ったgetGengoYear関数と組み合わせて下記のようなgetJapaneseDate関数というものを作ってみた。date型のパラメータを渡してあげると、平成20年3月15日(土)という形式で返してくれる。
和暦を返してくれる関数:getJapaneseDate関数
private Function getJapaneseDate(ByVal targetDate As Date) As String
'これに和暦を入れる
Dim japaneseDate As String
'これに元号を格納する
Dim targetYear As String = getGengoYear(targetDate)
'曜日の条件分岐。
If targetDate.DayOfWeek = DayOfWeek.Monday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(月)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Tuesday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(火)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Wednesday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(水)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Thursday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(木)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Friday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(金)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Saturday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(土)"
Else
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(日)"
End If
'出来上がった和暦を返す
Return japaneseDate
End Function
サンプルコード
実際に使うときは下記のような感じになる・・・かな。
Imports System.Globalization.JapaneseCalendar
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim todayDate As Date = Today.Date
MsgBox(getJapaneseDate(todayDate))
End Sub
private Function getJapaneseDate(ByVal targetDate As Date) As String
'これに和暦を入れる
Dim japaneseDate As String
'これに元号を格納する
Dim targetYear As String = getGengoYear(targetDate)
'曜日の条件分岐。
If targetDate.DayOfWeek = DayOfWeek.Monday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(月)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Tuesday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(火)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Wednesday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(水)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Thursday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(木)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Friday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(金)"
ElseIf targetDate.DayOfWeek = DayOfWeek.Saturday Then
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(土)"
Else
japaneseDate = targetYear & Format(targetDate, "MM月dd日") & "(日)"
End If
'出来上がった和暦を返す
Return japaneseDate
End Function
Private Function getGengoYear(ByVal targetDate As Date) As String
'これに元号を入れる
Dim gengo As String
'これに和暦の年を入れる
Dim targetGengoYear As String
'JapaneseCalendarクラスのインスタンス化
Dim jpCal As Globalization.JapaneseCalendar = New Globalization.JapaneseCalendar
'パラメータの日付から元号を判断する
Select Case jpCal.GetEra(targetDate)
Case 1
gengo = "明治"
Case 2
gengo = "大正"
Case 3
gengo = "昭和"
Case Else
gengo = "平成"
End Select
'元号と和暦の年とをくっつける
targetGengoYear = gengo & jpCal.GetYear(targetDate) & "年"
'出来上がった元号プラス和暦年を返す
Return targetGengoYear
End Function
End Class