C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

VBで和暦コード(1〜5)から元号を取得する方法

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■97149 / inTopicNo.1)  VBで和暦コード(1〜5)から元号を取得する方法
  
□投稿者/ sol (1回)-(2021/04/07(Wed) 11:09:04)

分類:[VB.NET/VB2005 以降] 

"5030407"(←令和3年4月7日)のような文字列から、2021年4月7日のDateTime型に変換したいのですが、
"令和"等の元号をハードコードせずに(IfやSelectCaseで"1"だったら"明治"等の変換方法は不可)行う方法を知りたいです。

JapaneseCalendarのGetEraで元号のコード1〜5が得られると思いますが、その逆で
・元号のコードから"令和"等の元号を取得し、
・元号を含む日付文字列("令和3年4月7日"等)を作り、
・そこからDateTime型に変換する、
という感じでしょうか?

その場合は元号のコードから元号を取得する方法が分かりません。
また、もっとシンプルなやり方があるような気がしますが何か無いでしょうか?
引用返信 編集キー/
■97150 / inTopicNo.2)  Re[1]: VBで和暦コード(1〜5)から元号を取得する方法
□投稿者/ shu (1246回)-(2021/04/07(Wed) 11:41:33)
No97149 (sol さん) に返信

Dim jcal As New JapaneseCalendar
Dim dt = jcal.ToDateTime(3, 4, 3, 0, 0, 0, 5)

これでdtに日付型の値が入るので使えないでしょうか?
引用返信 編集キー/
■97151 / inTopicNo.3)  Re[2]: VBで和暦コード(1〜5)から元号を取得する方法
□投稿者/ sol (2回)-(2021/04/07(Wed) 11:47:06)
2021/04/07(Wed) 16:37:35 編集(投稿者)

shu さま

ありがとうございます!
まさに、やりたいことができました!
引用返信 編集キー/
■97152 / inTopicNo.4)  Re[3]: VBで和暦コード(1〜5)から元号を取得する方法
□投稿者/ ニケ (17回)-(2021/04/07(Wed) 11:53:49)
No97151 (sol さん) に返信
当たり前の話ですが、新元号がでたらOSのパッチが当たるまで新元号は出てきません。
企業では、システムの環境保全の為、アップデートを保留にしたり遅らせる場合も
多いので、運用上、元号表記を使用すること自体を問題視する声があることも知っておいて下さい。
解決済み
引用返信 編集キー/
■97153 / inTopicNo.5)  Re[1]: VBで和暦コード(1〜5)から元号を取得する方法
□投稿者/ 魔界の仮面弁士 (3045回)-(2021/04/07(Wed) 12:12:29)
2021/04/07(Wed) 17:14:05 編集(投稿者)

No97149 (sol さん) に返信
> JapaneseCalendarのGetEraで元号のコード1〜5が得られると思いますが、その逆で

ちなみに JapaneseCalendar.Eras プロパティで、
有効な元号コードの一覧が得られます。

また、下記の点についても考慮しておくべきかと。


(1) 扱う日付範囲は、いつかからいつまで?

VB の日付型は、最小値が 0001/01/01 です。
VBA の日付型は、最小値が 0100/01/01 です。

JapaneseCalendar は 1868/01/01〜1868/09/07 の日付を許容していますが、
JapaneseCalendar.MinSupportedDateTime は 1868/09/08 となっています。

しかし日本においては、
 1872/12/31 (明治5年12月2日) までは 天保暦 (JapaneseLunisolarCalendar)
で、その翌日から
 1873/01/01 (明治6年1月1日) からは グレゴリオ暦 (JapaneseCalendar)
という切替があったため、
"1051210" (←明治5年12月10日)などを NG とする処理系もあります。

天保暦の期間までサポートするとなると、「閏月」の管理も必要になるので、
グレゴリオ暦相当に変換して扱う処理系もありますが……それもややこしいので
「サポート範囲は明治6年以降のみ」のように打ち切ってしまうのも一つの手です。


(2) 元号コードのエラーを補正する必要がありますか?

令和元年は5月1日からでしたが、
"5010430" (←令和元年4月30日) をエラーとするか、2019/04/30 として扱うか
"4310501" (←平成31年5月1日) をエラーとして扱うか、2019/05/01 として扱うか
という問題があります。
元号と年だけを参照し、月日は変換時に無視するという処理系もあります。


(3) 発布同日改元を許容するべきですか?

昭和→平成や平成→令和は「翌日改元」でしたが、
明治→大正や大正→昭和は「同日改元」だったため、
重複する期間が存在します。

1926年12月25日は「大正15年12月25日」であり、「昭和元年12月25日」でもありますが、
"4011225" と "3151225" を同じ日付 1926/12/25 として扱いますか?
それとも一方のみを有効な日付とし、他方をエラーとして扱いますか?

1912年7月30日も同日改元で、「明治45年7月30日」と「大正元年7月30日」は同一日です。


慶応→明治に至っては、1868/10/23 (慶応4年9月8日)の発布時に
旧暦1月1日に遡って適用されたたため、
1868/01/25(旧暦1月1日)〜1868/10/23(旧暦9月8日)の期間は
「慶応4年でもあり、明治元年でもある」期間です。
※ JapaneseCalendar.MinSupportedDateTime が 1868/09/08 である所以
解決済み
引用返信 編集キー/
■97154 / inTopicNo.6)  Re[2]: VBで和暦コード(1〜5)から元号を取得する方法
□投稿者/ sol (3回)-(2021/04/07(Wed) 16:43:04)
皆様

ありがとうございます。

shuさまの回答で解決したと勘違いしましたが、最後の引数は元号のコードではなくミリ秒だったんですね。

>Dim jcal As New JapaneseCalendar
>Dim dt = jcal.ToDateTime(3, 4, 3, 0, 0, 0, 5)

これだと令和がDateTimeに変換できるのは分かったのですが、平成や昭和はどのようにすれば良いか、もしご存知の方がいましたらご教示お願いできますでしょうか?

特殊な年月日でエラーになるケースは、今回はひとまず許容できる状況です。

JapaneseCalendarにセットされている元号を変更するのかと思いましたが、SetEraは無いんですよね。

引用返信 編集キー/
■97155 / inTopicNo.7)  Re[3]: VBで和暦コード(1〜5)から元号を取得する方法
□投稿者/ Hongliang (1161回)-(2021/04/07(Wed) 16:49:54)
> shuさまの回答で解決したと勘違いしましたが、最後の引数は元号のコードではなくミリ秒だったんですね。
>
> >Dim jcal As New JapaneseCalendar
> >Dim dt = jcal.ToDateTime(3, 4, 3, 0, 0, 0, 5)

https://docs.microsoft.com/ja-jp/dotnet/api/system.globalization.calendar.todatetime
ToDateTimeには引数7つのものと引数8つのものがあり、8つ目がeraになります。
引用返信 編集キー/
■97156 / inTopicNo.8)  Re[4]: VBで和暦コード(1〜5)から元号を取得する方法
□投稿者/ sol (4回)-(2021/04/07(Wed) 16:57:30)
2021/04/07(Wed) 17:32:25 編集(投稿者)

No97155 (Hongliang さん) に返信
>>shuさまの回答で解決したと勘違いしましたが、最後の引数は元号のコードではなくミリ秒だったんですね。
>>
>>>Dim jcal As New JapaneseCalendar
>>>Dim dt = jcal.ToDateTime(3, 4, 3, 0, 0, 0, 5)
>
> https://docs.microsoft.com/ja-jp/dotnet/api/system.globalization.calendar.todatetime
> ToDateTimeには引数7つのものと引数8つのものがあり、8つ目がeraになります。

そうですね!
今気づきました。

shuさまも、すみません汗

解決してます。
ありがとうございます。

皆様から頂いた情報、とても勉強になりました。
解決済み
引用返信 編集キー/
■97158 / inTopicNo.9)  Re[5]: VBで和暦コード(1〜5)から元号を取得する方法
□投稿者/ shu (1247回)-(2021/04/08(Thu) 07:10:39)
No97156 (sol さん) に返信
> 2021/04/07(Wed) 17:32:25 編集(投稿者)
>
> ■No97155 (Hongliang さん) に返信
> >>shuさまの回答で解決したと勘違いしましたが、最後の引数は元号のコードではなくミリ秒だったんですね。
> >>
> >>>Dim jcal As New JapaneseCalendar
> >>>Dim dt = jcal.ToDateTime(3, 4, 3, 0, 0, 0, 5)
>>
>>https://docs.microsoft.com/ja-jp/dotnet/api/system.globalization.calendar.todatetime
>>ToDateTimeには引数7つのものと引数8つのものがあり、8つ目がeraになります。
>
> そうですね!
> 今気づきました。
>
> shuさまも、すみません汗
>
> 解決してます。
> ありがとうございます。
>
> 皆様から頂いた情報、とても勉強になりました。

失礼しました。パラメータが1個足りてなく混乱させてしまいました。
Dim dt = jcal.ToDateTime(3, 4, 3, 0, 0, 0, 0, 5)
でした。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ