まとまりのないブログ

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

文字列中にある一部分だけを置き換える

備忘。正規表現を使ってある条件にマッチする場合、その文字列の一部分を別の文字列に置き換える、ということをやってみる。たとえば次のような文字列があったとする。 “00 abcde&#8221 …

no image

visual studioが不具合を起こした2

————————— Microsoft Visual Studio —&#821 …

no image

VB.NETのwindowsフォームのサイズをマウスで変更できるようにする

windowsフォームのサイズをマウスカーソルをフォームの境界線にもっていくとサイズ変更ができるようにする。方法は、formプロパティのAutoSizeModeをGrowOnlyに設定する。すると、フ …

no image

datasetの内容をxmlファイルに出力する

datasetの内容をxmlに出力するのにはたった一行、writexmlという関数を使うだけでできあがる模様。あいたたた。datagridにバインドされたデータを一生懸命xml化するためにコードを考え …

no image

メモ

現在改良中の家計簿ソフトのデータモデルを変更するかどうかについてのメモ。今のところはmicrosoftのaccessのjetという名前のデータベースでデータを管理している。作る前まではデータを保存する …