喫茶XRAYトップページ

[▲前のスレッド]

[11362] 新しい年号の前に・・・返信 削除
2017/9/13 (水) 15:58:45 おかぽん
こんにちは。

今日、あるお客様より、元号の変更への対応について質問されました。

そんなこんなで、以下のページを参考資料として、集めたわけです。

元号が改正された場合の西暦と和暦の相互変換について [JAPAN]
https://community.embarcadero.com/blogs/entry/year-convert-between-gregorian-and-japanese-new-era

Era Handling for the Japanese Calendar
https://msdn.microsoft.com/en-us/library/windows/desktop/ee923790.aspx

日本マイクロソフトの新元号 (和暦) 対応に関するサポート情報のブログです
https://blogs.technet.microsoft.com/jperablog/

ここから本題。

Windows 7 以降は、レジストリに元号の情報を持つようになっています。
例)"1989 01 08"="平成_平_Heisei_H"

SysUtils.pas の EraNames[x] には、 '平成', '昭和'...が入ってきますし、
レジストリに新しい元号のエントリを追加すると、その元号も取得できるのですが、
この文字列の中の "_"で区切られた、2つ目、3つ目、4つ目を取得するAPIとか
ご存知ありませんか?

4つ目の英字で表現された先頭 1 文字を取得できれば、あとはいらないんですけど。

システムの都合により、自前で日付の文字列処理している部分があるため、
プログラムの定数値で処理している部分をOSから取得した値で処理できるように
しておくと、困らないな〜と思ったわけです。

ついでに、SysUtils.pas の EraYearOffsetsも、西暦年しかとれないので、年月も
とる方法がないのか調査中。

英語が読めなくて(翻訳すると余計ややこしい)探しきれない・・・私を許して下さい

[11363] Re:新しい年号の前に・・・返信 削除
2017/9/13 (水) 18:57:49 Mr.XRAY
▼ おかぽんさん

> 元号が改正された場合の西暦と和暦の相互変換について [JAPAN]
> https://community.embarcadero.com/blogs/entry/year-convert-between-gregorian-and-japanese-new-era
>

おおっ,サンクスです.
後で参考リンクに追加させていただきます.

>4つ目の英字で表現された先頭 1 文字を取得できれば、あとはいらないんですけど。

日本語のロケールだと EraNames には日本湖の元号名が格納されるんでしたよね ?
う〜ん.
となるとレジストリからの直接の読み込みのかな.


[11364] Re2:新しい年号の前に・・・返信 削除
2017/9/13 (水) 19:09:08 おかぽん
▼ Mr.XRAYさん
> となるとレジストリからの直接の読み込みのかな.
ですよね〜

ちなみに、日付の形式文字列の"g"は、日本語表記の先頭一文字ですが、
EraNamesに入っている先頭文字を返しているだけです(Turbo Delphi まで確認)。
少なくともAPIを使って何かしているのではなさそうなので、APIで解決できる線は
望み薄かな〜と。



[11365] 備忘録返信 削除
2017/9/14 (木) 15:33:47 おかぽん
> Delphi XE5でグローバル変数「MaxEraCount」「EraNames」「EraYearOffsets」が
> 廃止されました。

下記リンク 2) より

1) 元号が変わった場合
http://mrxray.on.coocan.jp/Delphi/plDateEdit/B_UseMethod.htm#06

2) Delphi XE5対応元号選択式日付時刻入力コンポーネントTplDateEdit
http://www.gesource.jp/weblog/?p=6202

3) Delphi XE5で和暦の元号を取得するには
http://www.gesource.jp/weblog/?p=6130

4) Delphi XE5で和暦の始まりの年を取得するには
http://www.gesource.jp/weblog/?p=6131

5) System.SysUtils.TFormatSettings.TEraInfo
http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.SysUtils.TFormatSettings.TEraInfo

6) 日付の年号を略称で表示するには?[C#、VB]
http://www.atmarkit.co.jp/ait/articles/1506/10/news022.html


・Delphi のバージョンが上がっても、MTSH は取れそうにないけど、年月までは確認できそう。
・.NETでも、無理らしい。
 A〜Zの英字で、年月が取得できるか取得したりして、対応表を作るとか?

[11366] Re:備忘録返信 削除
2017/9/14 (木) 15:47:03 Mr.XRAY
▼ おかぽんさん

備忘録と書いてあるので (^^
これ,Delphi Forum の方に転載してもいいですか ?
元号変更が現実になっているので.
おそらくその時になると多くの方が知りたくなると思うので,

と,ここまで書いて思ったのですか,
もう少し後,来年ぐらいの方がいいかな... う〜ん.
ちょっと考えてみます.


[11367] Re2:備忘録返信 削除
2017/9/15 (金) 08:19:32 おかぽん
▼ Mr.XRAYさん
> これ,Delphi Forum の方に転載してもいいですか ?
どうぞどうぞ。

引き続き情報収集して、ここにつなげていきます。

[11368] Re3:備忘録返信 削除
2017/9/15 (金) 11:21:54 Mr.XRAY
>A〜Zの英字で、年月が取得できるか取得したりして、対応表を作るとか?

ちょっと調べてみました.英語表記はロケールの変更しないと無理がありそです.

[164][06_ロケールの日付の書式を和暦に変更]
http://mrxray.on.coocan.jp/Delphi/plSamples/164_DatePickerComponent.htm#06

こんなことするぐらいならレジストリの操作の方がよさそうな.ハハハッ.
年月の方は,以下のようにフォーマットでは取得できるので,みたら,
 SysUtils の DateTimeToString で処理しているようなので,何かヒントになる
コードがあるかな ? と思ったんですが,コード読むのが面倒....
で,あきらめました (^^;

//=============================================================================
//  動作確認 Windows 7 U64(SP1) + Delphi XE(UP1) Pro
//
//  レジストリの値は以下
//  2019 10 10  神武_神_Jimmu_J
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LDateTime1 : TDateTime;
  LDateTime2 : TDateTime;
  LDateText  : string;
begin
  LDateTime1 := VarToDateTime('2019/10/09');
  LDateTime2 := VarToDateTime('2019/10/10');

  LDateText := FormatDateTime('ggee年mm月dd日', LDateTime1) + sLineBreak
             + FormatDateTime('ggee年mm月dd日', LDateTime2);

  MessageBox(Handle, PChar(LDateText), '結果', MB_ICONINFORMATION);
end;




[11369] Re4:備忘録返信 削除
2017/9/15 (金) 14:20:25 Mr.XRAY
> コードがあるかな ? と思ったんですが,コード読むのが面倒....
> で,あきらめました (^^;


こういう姿勢は大事です.
山の世界ではこれを「勇気ある撤退」と言います.ホホホッ.


[11370] Re4:備忘録返信 削除
2017/9/15 (金) 18:39:53 おかぽん
▼ Mr.XRAYさん
>A〜Zの英字で、年月が取得できるか取得したりして、対応表を作るとか?
これをやってみようかと思い、レジストリに以下を書き込み

> //=============================================================================
> //  レジストリの値は以下
> //  2019 10 10  神武_神_Jimmu_J
> //=============================================================================


このとき、VarToDateTime('J1/12/31') は、例外発生。
VarToDateTime('H1/12/31') は、"平成1年12月31日" の 日付が返りました。

いきなり躓いて、やる気がなくなりました(Delphi5)。
7,Turbo,XE3 があるので、順番に試してみたいとこですが、今日はここまで。




[11371] Re5:備忘録返信 削除
2017/9/15 (金) 22:50:44 taka
▼ おかぽんさん
> このとき、VarToDateTime('J1/12/31') は、例外発生。
> いきなり躓いて、やる気がなくなりました(Delphi5)。


この内容はあなたの最初のリンク先に記述されているようですが・・・。
>元号が改正された場合の西暦と和暦の相互変換について [JAPAN]
>https://community.embarcadero.com/blogs/entry/year-convert-between-gregorian-and-japanese-new-era
>>なお、VarToDateTime で和暦→西暦変換を実装すれば...


Variants.VarToDateTime

Variants.VarToDateAsString(V);

VarUtils.VarDateFromStr

Error

VarDateFromStrの結果が犯人です

VarDateFromStrでgoogle検索

oleaut32.dllが犯人だという投稿を発見

VarToDateTimeを使いたいのでしたら
改元発表後のマイクロソフトのWindows Update待ちでしょうね


[11374] Re6:備忘録返信 削除
2017/9/18 (月) 20:20:27 おかぽん
▼ takaさん
> この内容はあなたの最初のリンク先に記述されているようですが・・・。
> >元号が改正された場合の西暦と和暦の相互変換について [JAPAN]
> >https://community.embarcadero.com/blogs/entry/year-convert-between-gregorian-and-japanese-new-era
> >>なお、VarToDateTime で和暦→西暦変換を実装すれば...

あぁ・・・すみません。
本当ですね。

試行錯誤しているうちに、そんなことも忘れ去っていたいたようです。
なんのための備忘録なのやら(;´Д`)


> oleaut32.dllが犯人だという投稿を発見
これですね、
https://twitter.com/lynatan/status/819202543460855809


[11375] Delphi2の実装返信 削除
2017/9/18 (月) 20:23:14 おかぽん
リソースで以下の文字列を保持していたので、形式文字列 "g" で、アルファベットの
一文字を返すことができたようです。

 "M,明,明治,1868,1,1"
 "T,大,大正,1912,7,30"
 "S,昭,昭和,1926,12,25"
 "H,平,平成,1989,1,8"


[11376] Re:Delphi2の実装返信 削除
2017/9/19 (火) 08:44:41 Mr.XRAY
▼ おかぽんさん
> リソースで以下の文字列を保持していたので、形式文字列 "g" で、アルファベットの
> 一文字を返すことができたようです。
>
>  "M,明,明治,1868,1,1"
>  "T,大,大正,1912,7,30"
>  "S,昭,昭和,1926,12,25"
>  "H,平,平成,1989,1,8"


なるほど...
Delphi 2 ....


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82