まとまりのないブログ

something which something is something

vb.net

西暦の日付を和暦の日付に変換してみる

投稿日:

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

-vb.net

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

no image

reportviewer はデータソースが複数あるとわけがわからない状態になる

visual studioのreportviewer コントロールの設定で嵌ってしまったので備忘。reportviwerコントロールをフォーム上に配置したらレポートの設定をするためにrdlcという拡張 …

no image

windowsアプリケーションにグラフを追加してみる

MSChartを使うことを諦めて別のグラフコンポーネントを探していたところ、visual studio 2005に標準でreportviwerというコンポーネントがあることに気づいた。reportとい …

no image

継承と実装

用語がどうもごちゃごちゃしていて頭に入ってきにくい。解説する人によって捉え方が違っていたりするのが原因ではあるのだろうけれど。vb.netにおける継承と実装について。 継承 : inherits 実装 …

no image

datagridにバインドしたデータが120秒経つと消える・・・

訳の分からない現象が現れた。accessのmdbへselect文を発行して取得したテーブルをdatagridコントロールにバインドするようにプログラムした。そしてデバッグで表示を確かめようとしたところ …

no image

今月の年月の値を取得する

sqlのwhere句に使うための検索条件を作るときに迷ってしまったので覚え書き。まあ、出来てしまえばなんてことは無かったけれど、フォーマットとか関数とか調べても年月のみを取得するメソッドが見当たらなか …