連載
» 2003年06月06日 05時00分 公開

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

.NET Frameworkではどの言語のバージョンにも、日本固有の暦である和暦を扱う機能が含まれている。C#およびVB.NETで西暦と和暦を変換する方法を解説する。

[川俣晶,株式会社ピーデー]
「.NET TIPS」のインデックス

連載目次

 近年の基本的なパソコン・ソフトは、最初から国際化を意識して設計されることが当たり前となっている。開発者が自分の住んでいる国のことだけ考えて開発するような態度は、もはや通用しない時代になったといえる。そのため、米国製ソフトウェアであっても、日本人が思っている以上に日本特有の事情に対応する機能が当初から含まれている場合がある(ページ末の余談参照)。

 例えば、.NET Frameworkではどの言語のバージョンにも、日本固有の暦である和暦を扱う機能が含まれている。日本の社会でも主に西暦が使用されるようになり、1度もこのような機能を使わないで見過ごしてしまうプログラマーも多いと思う。しかし、完全に和暦のニーズが消えたわけではない。これを活用することが要求される場面は現実にあちこちで存在するだろう。

和暦についての情報を得る

 さて、和暦に関する情報は、JapaneseCalendarクラス(System.Globalization名前空間)が提供してくれる。このクラスはCalendarクラス(System.Globalization名前空間)を継承したもので、同じように世界中のさまざまな暦が、このクラスを継承したクラスとして存在している。

 以下に、このJapaneseCalendarクラスを用いて、日付時刻を保持するDateTime構造体に含まれる年情報を、年号と年数で取得するサンプル・プログラムを示す。

// wareki1.cs

using System;
using System.Globalization;

class WarekiSample1 {
  static void Main() {

    DateTime 日付 = new DateTime(2003, 7, 1, 12, 34, 56);
    JapaneseCalendar カレンダー = new JapaneseCalendar();
    Console.WriteLine(カレンダー.GetEra(日付));
    // 出力:4

    string [] 元号名 = { "明治", "大正", "昭和", "平成" };
    Console.WriteLine(元号名[カレンダー.GetEra(日付) - 1]);
    // 出力:平成

    Console.WriteLine(カレンダー.GetYear(日付));
    // 出力:15
  }
}

// コンパイル方法:csc wareki1.cs

西暦で示された日付から年号と年数を取得するサンプル・プログラム(C#版:wareki1.cs)
wareki1.csのダウンロード

' wareki1.vb

Imports System
Imports System.Globalization

Module WarekiSample1
  Sub Main()
    Dim 日付 As DateTime = New DateTime(2003,7,1,12,34,56)
    Dim カレンダー As JapaneseCalendar = New JapaneseCalendar()

    Console.WriteLine(カレンダー.GetEra(日付))
    ' 出力:4

    Dim 元号名 As String() = {"明治", "大正", "昭和", "平成"}
    Console.WriteLine(元号名(カレンダー.GetEra(日付) - 1))
    ' 出力:平成

    Console.WriteLine(カレンダー.GetYear(日付))
    ' 出力:15

  End Sub
End Module

' コンパイル方法:vbc wareki1.vb

西暦で示された日付から年号と年数を取得するサンプル・プログラム(VB.NET版:wareki1.vb)
wareki1.vbのダウンロード

 このサンプル・プログラムでは、和暦を扱うということで変数名などにあえて日本語を使ってみた。

 さて、ここでポイントになるのは、もちろんJapaneseCalendarクラスである。このインスタンスを作成し、いくつかのメソッドを呼び出している。GetEraメソッドは、指定された日付時刻が示す元号を得る。結果は整数で得られ、1が明治、2が大正、3が昭和、4が平成となる。GetYearメソッドは、その元号内での年数を整数で返す。この2つを使えば、「2003年」が「平成15年」であることを突き止められるわけである。

DateTime構造体を和暦の文字列に変換する

 ただ単にDateTime構造体の値を和暦の文字列に変換するだけなら、もっと手軽な方法がある。以下はそれを示した例である。

// wareki2.cs

using System;
using System.Globalization;

class WarekiSample2 {
  static void Main() {

    CultureInfo culture = new CultureInfo("ja-JP", true);
    culture.DateTimeFormat.Calendar = new JapaneseCalendar();

    DateTime target = new DateTime(2003, 7, 1);
    string result = target.ToString("ggyy年M月d日", culture);
    Console.WriteLine(result);
    // 出力:平成15年7月1日
  }
}

// コンパイル方法:csc wareki2.cs

西暦の日付を和暦の文字列に変換するサンプル・プログラム(C#版:wareki2.cs)
wareki2.csのダウンロード

' wareki2.vb

Imports System
Imports System.Globalization

Module WarekiSample2
  Sub Main()
    Dim culture As CultureInfo = New CultureInfo("ja-JP", True)
    culture.DateTimeFormat.Calendar = New JapaneseCalendar()

    Dim target As DateTime = New DateTime(2003, 7, 1)
    Dim result As String = target.ToString("ggyy年M月d日", culture)
    Console.WriteLine(result)
    ' 出力:平成15年7月1日

  End Sub
End Module

' コンパイル方法:vbc wareki2.vb

西暦の日付を和暦の文字列に変換するサンプル・プログラム(VB.NET版:wareki2.vb)
wareki2.vbのダウンロード

 ポイントは、CultureInfoクラス(System.Globalization名前空間)だ。これは各地域の文化固有の情報を扱うクラスである。コンストラクタのパラメータに"ja-JP"を付けてインスタンスを作成すると、「日本語の日本」についてのインスタンスが得られる。

 しかし、標準では、「日本語の日本」も西暦(グレゴリオ暦)が選択されているので、これを和暦(JapaneseCalendarクラスで示される)に置き換える必要がある。それに該当するのは、culture.DateTimeFormat.CalendarにJapaneseCalendarクラスのインスタンスを代入している行である。これにより、このCultureInfoクラスのインスタンスは、和暦という暦を持つカルチャーを示すオブジェクトとなった。

 後はこれを用いて、DateTime型の値から文字列への変換をToStringメソッドを用いて行えばよい。ToStringメソッドの2つ目のパラメータにCultureInfoクラスのインスタンスが指定されている点に注意をしていただきたい。なお、書式指定内の「gg」は元号名を示す。もちろん「yy」は年、「M」は月、「d」は日である。

和暦の文字列をDateTime構造体に変換する

 逆の変換も同様の手法で実現できる。和暦の文字列をDateTime構造体の値に変換するには、ToStringメソッドではなく、ParseExactメソッドを用いればよい。以下はそれを記述した例である。

// wareki3.cs

using System;
using System.Globalization;

class WarekiSample3 {
  static void Main() {

    CultureInfo culture = new CultureInfo("ja-JP", true);
    culture.DateTimeFormat.Calendar = new JapaneseCalendar();

    string target = "平成15年7月1日";
    DateTime result
      = DateTime.ParseExact(target, "ggyy年M月d日", culture);
    Console.WriteLine(result.ToLongDateString());
    // 出力:2003年7月1日
  }
}

// コンパイル方法:csc wareki3.cs

和暦の文字列をDateTime構造体に変換するサンプル・プログラム(C#版:wareki3.cs)
wareki3.csのダウンロード

' wareki3.vb

Imports System
Imports System.Globalization

Module WarekiSample3
  Sub Main()
    Dim culture As CultureInfo = New CultureInfo("ja-JP", True)
    culture.DateTimeFormat.Calendar = New JapaneseCalendar()

    Dim target As String = "平成15年7月1日"
    Dim result As DateTime = DateTime.ParseExact(target, "ggyy年M月d日", culture)
    Console.WriteLine(result.ToLongDateString())
    ' 出力:2003年7月1日

  End Sub
End Module

' コンパイル方法:vbc wareki3.vb

和暦の文字列をDateTime構造体に変換するサンプル・プログラム(VB.NET版:wareki3.vb)
wareki3.vbのダウンロード

 このサンプル・プログラムのポイントは、ParseExactメソッドの第3パラメータに、和暦を持つ日本語の日本を示すCultureInfoオブジェクトを指定している点である。書式指定文字などは、ToStringメソッドで使用したものと同じである。


 以下、余談。例えば、アメリカ人にも国際化に情熱を燃やす人達がいる。実際に筆者も、さるOSベンダーのミーティングで、日本人技術者が「いらないんじゃないか」といっている元号のサポートを、仕様に入れようと熱心に努力しているアメリカ人と出会ったことがある。こういった特異な情熱を傾ける人達の仕事は、マイクロソフト製品だけでなく、JavaやLinuxの国際化機能などでも見ることができる。こういった人達は、日本人技術者が「日本でこういう機能が必要だから付けてくれ」とリクエストするような場当たり的な機能追加ではなく、包括的に国際的な機能をまとめて扱おうとする。そのため、個々の機能が目立たないことが多い。しかし、各言語向きの多くの機能が当たり前のように揃っているOSやプログラム言語は増えつつある。

カテゴリ:クラス・ライブラリ 処理対象:日付と時刻
使用ライブラリ:JapaneseCalendarクラス(System.Globalization名前空間)
使用ライブラリ:Calendarクラス(System.Globalization名前空間)
使用ライブラリ:CultureInfoクラス(System.Globalization名前空間


「.NET TIPS」のインデックス

.NET TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。