日付の和暦⇔西暦変換

解決


ちゃまき  2012-07-04 20:16:03  No: 147667  IP: 192.*.*.*

VB2010を使用しています。
和暦と西暦の表示の変換についてなのですが、
パターン①  H24/06/06 のような日付を 2012/06/06に変換
パターン②  H24/06/06のような日付を  平成24年6月6日に変換
パターン③  2012/06/06のような日付を  平成24年6月6日に変換
という3パターンの変換を求められています。変換する日付は任意の
日付です。
VB6でいうFormat関数がなくなったためどうすれば、もっとも簡単に変換できるでしょうか?

編集 削除
魔界の仮面弁士  2012-07-04 23:19:52  No: 147668  IP: 192.*.*.*

> VB6でいうFormat関数がなくなったため
Format 関数はありますが、VB6 のものとは仕様が異なるので、
そのままのコードでは動かいのですよね…。

「日本語環境以外でも和暦を表示させたい」といったニーズにも
対応できるよう、多言語対応に関する仕様が変更されているので、
仕方ないのでしょうけれども。

# VB6 でも、"2012/07/04" のような文字列が欲しい場合に、
#   (誤) Format(Now, "YYYY/MM/DD")
#   (正) Format(Now, "YYYY\/MM\/DD")
# のような間違いは良くありましたね。


> H24/06/06 のような日付を 2012/06/06に変換
日付(Date型)ではなく、文字列(String)からの変換ということでしょうか。


日付型から文字列への変換には、String.Format メソッドあるいは
日付型の ToString メソッドに書式指定することで行えます。

逆に文字列から日付型へ変換するのは、Date.TryParseExact メソッドです。
書式も指定できるので、日本だけでなく、他国の暦にも対応できます。


暦の指定には、System.Globalization 名前空間を利用することになります。
多言語対応の肝となるのは、『CultureInfo クラス』ですね。

具体的な記述方法は下記が参考になるかと思いますが、必要な暦(Calendar)を
CultureInfo の .DateTimeFormat.Calendar プロパティにセットしておき、
それを String.Format や Date.TryParseExact に渡せば OK です。

http://dobon.net/vb/dotnet/string/datetimeformat.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/034wareki/wareki.html



もしもこれらのメソッドに CultureInfo を渡さなかった場合には、
コントロールパネルの地域設定などから取得された「既定のカルチャ」が使われます。
この既定のカルチャを変更する場合には、
  My.Application.ChangeCulture メソッド
  My.Application.ChangeUICulture メソッド
  System.Windows.Forms.Application.CurrentCulture プロパティ
  System.Threading.Thread.CurrentThread.CurrentCulture プロパティ
  System.Threading.Thread.CurrentThread.CurrentUICulture プロパティ
などを利用します。


なお、.NET でサポートしている暦としては、下記の物があります。


・和暦 (JapaneseCalendar クラス)  … 太陽暦: 今回使うのはコレ
・グレゴリオ暦 (GregorianCalendar クラス) … 太陽暦: VB6 の vbCalGreg、我々が良く使う「西暦」
・ユリウス暦 (JulianCalendar クラス) … 太陽暦
・回教暦 (HijriCalendar クラス) … 太陰暦: VB6 の vbCalHijri
・サウジ回教暦 (UmAlQuraCalendar クラス) … 太陰暦
・韓国暦 (KoreanCalendar クラス) … 太陽暦
・台湾暦 (TaiwanCalendar クラス) … 太陽暦
・タイ仏暦 (ThaiBuddhistCalendar クラス) … 太陽暦
・ペルシャ暦 (PersianCalendar クラス) … 太陽暦
・ヘブライ暦 (HebrewCalendar クラス) … 太陰太陽暦


この他、東アジアの太陰太陽暦(EastAsianLunisolarCalendar)系の暦があります。
これらはカルチャとしては指定できず、計算/変換用の暦として利用されます。
(たとえば、うるう年、うるう月、うるう日の取得などが行えます)

・日本旧暦 (JapaneseLunisolarCalendar クラス) … 太陰太陽暦
・韓国陰暦 (KoreanLunisolarCalendar クラス) … 太陰太陽暦
・中国暦 (ChineseLunisolarCalendar クラス) … 太陰太陽暦
・台湾太陽太陰暦 (TaiwanLunisolarCalendar クラス) … 太陰太陽暦

編集 削除
魔界の仮面弁士  2012-07-04 23:55:30  No: 147669  IP: 192.*.*.*

> この既定のカルチャを変更する場合には、
済みません、(変更でなく)取得用の物も混在させてしまいました。


>> もっとも簡単に変換できるでしょうか?
いろいろな暦を使えるとはいえ、その分、手間は増えてしまいましたね…。



>> という3パターンの変換を求められています。
あらかじめ「Imports System.Globalization」しておいてください。


>>  H24/06/06 のような日付を 2012/06/06に変換
Label1.Text = CDate("H24/06/06").ToString("yyyy\/MM\/dd", CultureInfo.InvariantCulture)


>>  H24/06/06のような日付を  平成24年6月6日に変換
Dim 日本和暦 As New CultureInfo("ja-jp")
日本和暦.DateTimeFormat.Calendar = New JapaneseCalendar()
Label2.Text = CDate("H24/06/06").ToString("ggy年MMMMd日", 日本和暦)


>  2012/06/06のような日付を  平成24年6月6日に変換
Label3.Text = CDate("2012/06/06").ToString("ggy年MMMMd日", 日本和暦)


本当は Dim dt As Date = CDate("2012/06/06") などではなく、
  Dim dt As Date = Date.ParseExact("2012/06/06", "yyyy/MM/dd", CultureInfo.InvariantCulture)
などとした方が良いのでしょうが、今回は「もっとも簡単に」との
ことなので、ここではあえて手抜き実装なコードで書いています。

編集 削除
ちゃまき  2012-07-05 08:49:35  No: 147670  IP: 192.*.*.*

魔界の仮面弁士様  ありがとうございます。
無事、3パターンとも変換できました。

いつも詳しい回答、感謝しています。

編集 削除