お世話になっております。らりばどです。
C言語ソースからの移行について質問があります。
WindowsAPI関数からの返り値をctime関数で文字列変換した
結果を表示するプログラムがあります。
それをDelphi側に移行しようとした時のことです。
※前回にカキコしましたイベントログに関するとこです。
ReadEvevtLog関数を使ってイベントログを読み出した後、
日付部分は規定値からの経過秒数で記録されているらしく、
C側ソースでは、
> printf("生成時刻: %s", ctime(&pBuf->TimeGenerated));
と記述されていました。
そこでctime関数の仕様を調べてみると、"1970/01/01 00:00:00"
からの経過秒数を文字列化すると見つけました。
そこでDelphi側ソースに、
> //生成時刻の設定
> WkDateTime := 0;
> WkDateTime := WkDateTime + EncodeDate(1970,01,01);
> WkDateTime := WkDateTime + EncodeTime(0,0,0,0);
> WkDateTime := WkDateTime + (PELR.TimeGenerated * (1/24/60/60));
> GenTimeStr := FormatDateTime('yyyy/mm/dd hh:nn:ss',WkDateTime);
と記述しました。
しかし実行してみるとちょうど9時間遅れた時刻が表示されます。
これは何故なのでしょうか?
理由をご存知の方、教えて下さい。
ちなみに現在は、
> //生成時刻の設定
> WkDateTime := 0;
> WkDateTime := WkDateTime + EncodeDate(1970,01,01);
> WkDateTime := WkDateTime + EncodeTime(9,0,0,0); ←"変更箇所"
> WkDateTime := WkDateTime + (PELR.TimeGenerated * (1/24/60/60));
> GenTimeStr := FormatDateTime('yyyy/mm/dd hh:nn:ss',WkDateTime);
このように書き換えて実行させていますが、理由がわからず
このままで良いものか判断がつきません。
よろしくお願いします。
元の値がGMT(グリニッジ標準時)だからでしょう。
日本との時差が9時間です。
日本国内でのみ使うシステムであれば、上のやりかたで問題ないと思います。
海外でも同じように「現地時刻」にあわせるのであれば、環境変数TZを見てあわせるとか、GetTimeZoneInformationを使ってあわせるとかすればOKです。
>にしのさん
勉強のつもりで始めたことが仕事で実際に使いそうになってしまった為、
時間がなくとりあえずC言語で作成することになりました。
ということで一旦解決とさせていただきます。
といってもC言語でもわからんところがあり、このサイトのC言語用の
QA掲示板に質問を挙げさせていただきましたが・・・。
また時間ができた時に再度取り組みます。
P.S.
パッと見では、「GetTimeZoneInformationって何?」で止まってしま
いました。
追伸.
「GetTimeZoneInformation」理解できました。
これで現地時刻が取得できます。
ありがとうございました。
ツイート | ![]() |