[delphi-users:4593] VarToDateTimeの追加元号への対応について

260 views
Skip to first unread message

miya

unread,
Jan 11, 2017, 12:49:53 AM1/11/17
to delphi...@freeml.com
こんにちは、TOMIYAです

表題の件

2019年に元号が変わるらしいとのことで、

Windows7 64bit のマシンでレジストリ値
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
に、仮で作った新元号をセットしてDelphiXEでTDatetime値 - String 変換プログラムを用意してテスト
してみました、

Hogetext := FormatDatetime('ggee年mm月dd日',DateValue);

hogetextの内訳は、DateValueの内訳に応じて仮で作った新元号にも対応した値になっていました。
続いて、逆変換も可能かどうかと思い、上記の結果を用いて、

DateValue := Vartodatetime(Hogetext)

とやってみると、「平成」までのデータ変換は期待通りの結果が取得できますが、仮で作った新元号の場合は
EVariantTypeCastError例外が発生します。
そこで、vartodatetimeでは、前述のレジストリ値は使用していないらしい、というのは推測できましたが、
仮で作った新規元号にもvartodatetimeを対応させるには、RTLの修正を行うか、もしくは別途関数を作る必要が
ありますか?

TOMIYA


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
あなたの息は大丈夫?
自分の息に自信のないあなたに!!
http://ad.freeml.com/cgi-bin/sa.cgi?id=p9MeJ
------------------------------------------------------[freeml byGMO]--

7of9

unread,
Jan 11, 2017, 4:07:52 AM1/11/17
to delphi...@freeml.com

こんにちは、7of9です。

https://social.msdn.microsoft.com/Forums/ja-JP/a93ec79d-69a5-4bb7-ae5d-a8aabfdcb9dd/systemglobalizationcultureinfo?forum=netfxgeneralja

にあります以下のコメントからはDelphiで対応できるないのかもしれませんね。
(.NET 4.0を使用していない? という理解)

> と説明されているとおりで、Windows 7以降でのネイティブアプリもしくは.NET 4.0を使用した場合にしか機能しません。手元でレジストリ設定して試してみましたが、Windows 10 + .NET 3.5ではやはり新しい元号は表示されませんでした。(Windows 10 + .NET 4以降では表示されました。)


> RTLの修正を行うか、もしくは別途関数を作る必要がありますか?

こちらには関しては分かりませんが、最後の手段としては別途関数を
作ることになるかもしれませんね。

他の方が良い案をご存知かどうか。



> こんにちは、TOMIYAです
>
> 表題の件
>
> 2019年に元号が変わるらしいとのことで、
>
> Windows7 64bit のマシンでレジストリ値
> HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsCalendarsJapaneseEras
> に、仮で作った新元号をセットしてDelphiXEでTDatetime値 ? String 変換プログラムを用意してテスト
> してみました、
>
> Hogetext := FormatDatetime(ggee年mm月dd日,DateValue);
>
> hogetextの内訳は、DateValueの内訳に応じて仮で作った新元号にも対応した値になっていました。
> 続いて、逆変換も可能かどうかと思い、上記の結果を用いて、
>
> DateValue := Vartodatetime(Hogetext)
>
> とやってみると、「平成」までのデータ変換は期待通りの結果が取得できますが、仮で作った新元号の場合は
> EVariantTypeCastError例外が発生します。
> そこで、vartodatetimeでは、前述のレジストリ値は使用していないらしい、というのは推測できましたが、
> 仮で作った新規元号にもvartodatetimeを対応させるには、RTLの修正を行うか、もしくは別途関数を作る必要が
> ありますか?
>
> TOMIYA


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
■即戦力人材と企業をつなぐ転職サイト■
ビズリーチに【無料登録】すると・・・
・一流企業の求人情報を閲覧できます
・ヘッドハンターからスカウトが届きます
ビズリーチ【無料登録】ページはこちら
http://ad.freeml.com/cgi-bin/sa.cgi?id=p9Pmv
------------------------------------------------------[freeml byGMO]--

7of9

unread,
Jan 11, 2017, 5:14:37 AM1/11/17
to delphi...@freeml.com
C++ Builder XE4ですが、自前変換してみました。

http://qiita.com/7of9/items/d6dadd3364362a2ea55d


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
◇◆オリックス銀行カードローン◆◇
新金利登場!金利年1.7%~17.8%
「おまとめ・借りかえOK!」
限度額300万円まで所得証明書不要
http://ad.freeml.com/cgi-bin/sa.cgi?id=p9PWY
------------------------------------------------------[freeml byGMO]--

miya

unread,
Jan 11, 2017, 7:19:49 PM1/11/17
to delphi...@freeml.com
7of9さん。ありがとうございました。参考になります。

http://qiita.com/7of9/items/d6dadd3364362a2ea55d より、
>static const TDate kDate_startNewEra = ("2016/01/01");

とりあえず、同じようなことをやって別途関数を用意しておこうと思います。
次の次以降も踏まえて用意すべきか、結構悩ましかったりします・・
(そこまで考える必要はないだろとうは思いつつ、)
MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
☆世界初☆17種類以上のお茶がワンタッチで楽しめる
ネスレのカプセル式お茶マシン「スペシャル.T」を今なら無料でお試し!
あなたの想像を超えるお茶の世界を♪♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=p9Vem
------------------------------------------------------[freeml byGMO]--

auemura

unread,
Jan 11, 2017, 8:23:20 PM1/11/17
to delphi...@freeml.com
上村です。

別の方法としてStrToDateTimeを使う方法を

var
Fmt: TFormatSettings;
DateStr: String;
DateVal: TDateTime;
begin
Fmt := TFormatSettings.Create('ja-JP');
Fmt.ShortDateFormat := 'ggee/mm/dd';
Fmt.DateSeparator := '/';
DateStr := '仮名1年1月10日';
DateStr := StringReplace(DateStr, '年', '/', []);
DateStr := StringReplace(DateStr, '月', '/', []);
DateStr := StringReplace(DateStr, '日', '', []);
DateVal := StrToDateTime(DateStr, Fmt);
end;

TFormatSetting.ShortDateFormat がgで始まってると和暦というかEraを考慮する処理になるようです。
後は、日付のセパレータが年とか月だと認識してくれないので置換してあげると良い感じに処理してくれるっぽいです。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
今までダイエットに失敗してきたあなた
必見です!!やせる事に特化した専門店
ミスパリダイエットセンター☆彡☆彡
今なら、5,000円で体験実施中♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=p9VKc
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages