- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:特定のタイムゾーンからtime_tを得る方法)
特定のタイムゾーンからtime_tを得る方法
このQ&Aのポイント
- 特定のタイムゾーンからtime_tを得る方法について悩んでいます。VC++6.0で開発した案件の改造を行っているのですが、その中でtime_tをインタフェースとするライブラリを使う必要があります。日時情報は世界各地のログ情報の中にあり、各地のタイムゾーンによる文字列形式で表されています。
- TzSpecificLocalTimeToSystemTime関数を使えば、タイムゾーンからUTCのSYSTEMTIME構造体に変換できることは分かっていますが、それをtime_tに変換する方法がわかりません。mktimeなどはローカルタイムを扱うため、変換に使用することができません。
- VC++6.0では.NET Frameworkを使用しない方法で対応する必要があります。自分で計算するライブラリでも構いませんので、良い変換方法があれば教えていただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SYSTEMTIME が得られるなら、そこから SystemTimeToFileTime で、 FILETIME=1601 年から 100 ナノ秒単位の時間が得られます。 FILETIME値から time_tの起点である「1970年1月1日0時0分0秒のFILETIME値」=「116444736000000000」を引いて、 10000000(1秒と100ナノ秒の比)で割れば、エポック秒に変換できます。 (あるいは、10000000で割ってから、11644473600を引いてもいいでしょう) 変換方向は逆ですが、上記定数の根拠については http://support.microsoft.com/kb/167296/ja が参考になるでしょうか。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.1
ローカルなタイムゾーンとして変換した後で補正するというのはできそうだけど.
質問者
お礼
ご回答誠にありがとうございます! 私もローカルタイム情報を取得し、一旦各国のデータを仮にローカルタイムとして(例えばmktimeで)time_tに変換した後、自分のローカルタイムとの差分を出して計算してみてはどうかとも思っていたのですが、GetTimeZoneInformationの使い方がなかなか理解出来ずにおります。時間があったらそちらの方法もトライしてみようと思っています。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724421%28v=vs.85%29.aspx
お礼
素晴らしいご回答、誠にありがとうございます! この方法でチャレン時してみようと思います。 とても助かりました。 蛇足ですが、今まで漠然とCTimeで取れると思い込んでいた反省から、msdnの日本語サイトのSystemTimeToFileTimeにUTCと書かれていないので、これが本当にUTCなのかちょっと疑ってたのですが、 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724948%28v=vs.85%29.aspx こちらに明記されていました。