VB2010を使用しています。
和暦と西暦の表示の変換についてなのですが、
パターン① H24/06/06 のような日付を 2012/06/06に変換
パターン② H24/06/06のような日付を 平成24年6月6日に変換
パターン③ 2012/06/06のような日付を 平成24年6月6日に変換
という3パターンの変換を求められています。変換する日付は任意の
日付です。
VB6でいうFormat関数がなくなったためどうすれば、もっとも簡単に変換できるでしょうか?
> 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 クラス) … 太陰太陽暦
> この既定のカルチャを変更する場合には、
済みません、(変更でなく)取得用の物も混在させてしまいました。
>> もっとも簡単に変換できるでしょうか?
いろいろな暦を使えるとはいえ、その分、手間は増えてしまいましたね…。
>> という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)
などとした方が良いのでしょうが、今回は「もっとも簡単に」との
ことなので、ここではあえて手抜き実装なコードで書いています。
魔界の仮面弁士様 ありがとうございます。
無事、3パターンとも変換できました。
いつも詳しい回答、感謝しています。
ツイート | ![]() |