2012-04-16 47 views
2

Windowsマシンで現地時間をUTCに変換できる必要があります。私はこれを行うと主張SystemTimeToTzSpecificLocalTime APIを見つけましたが、その後、私はその説明を読み、これを見つけた:C++ WinAPIを使用してWindowsマシンで現地時間をUTCに確実に変換する方法

SystemTimeToTzSpecificLocalTime機能は、以下の条件の下で、誤って現地時間を計算することができる:

  • タイムゾーン古い年と新しい年の異なるUTCオフセットを使用します。
  • 変換されるUTC時間と計算された現地時間は、別の年です。
  • は、MSへの私の最初の修辞的な質問「それが信頼性の高いAPIを記述する方法は難しい?」

そして実際の質問 - 時間の100%でどのように動作するのですか? (そしてAPIが示唆しているようなものではない)

+0

将来的にはかなりうまくいかない、たとえば –

+0

逆の代わりに実際に必要な機能しか見つけられなかった場合は、この質問をしないと思うかもしれません。 ['TzSpecificLocalTimeToSystemTime'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms725485.aspx)は、「Windowsマシン上でローカルタイムをUTCに変換する」というものであり、不正確な結果を計算する。 –

+0

@RobKennedy:うん、良い点。なぜTzSpecificLocalTimeToSystemTimeにこの問題がないのですか? – ahmd0

答えて

5

あなたの質問に対する答えは、本質的に不可能であるということです。これは、コンピュータサイエンスの人々の理由の一つです嫌い現地時間を扱う。

ここで混乱する問題のいくつかの例を示します。1時間30分に2時から1時に戻ると、1:30が2つあります。私たちは、夏時間がもしあれば、何10年後になるのかを今日知る方法もありません。タイムゾーンの境界線が移動することがあるため、現在の太平洋標準時になっていることを知っているだけでは、85年前のタイムゾーンのオフセットがわからない場合があります。うるう秒が将来挿入される可能性があるかどうかを知る方法はありません。

可能な状況に遭遇した場合は、特定の状況でこれらの操作を可能にする特定の状況でコードを作成する必要があります。提供された操作は一般化され、使用できるケースを制約することなく「通常正しい」結果を提供します。

モラル:表示以外は現地時間を使用しないでください。それでも、過去または未来の時間を現地時間に変換することは問題になります。

+0

OK、あなたの意見が分かります。私は実際にすべての日付/時刻をUTCで保存しますが、SetWaitableTimer()APIの現地時間にそれらを必要とします。だから、もし私がこの変換を行う必要があるならば、私の質問に言い換えると、将来は1年と言えます。それは信頼できるでしょうか? – ahmd0

+0

なぜ['SetWaitableTimer'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms686289.aspx)、Ahmd0の現地時間が必要ですか? 「システムがUTCベースの時間を内部的に使用するため、UTCベースの絶対時間を必ず使用してください。そして、絶対的な猶予時間*が現地時間であったとしても、現地時間はまだ必要ではないでしょう。負の値は相対時間を示します。 –

+0

@RobKennedy:はい、私は同意しますが、それは簡単ではありません。 1.私のソフトウェアでは、ユーザーが指定できる待機時間が使用されています。夏時間の場合は「相対時間」として設定することをお勧めします。 2.実際の日付/時刻はユーザーからのもので、UTCを使用することは期待できません。それが私が変換する必要がある理由です。 – ahmd0

3

DSTの期間が特定の地域で変更されることがあるため、過去および将来のすべてのケースで正しいものを書くのは難しいです。

しかし、私はこの機能が必要です。私はCの関数(localtime、mktime、...)を使用することをお勧めします。私は最近、Windows関数SystemTimeToTzSpecificLocalTimeがCitrixサーバー上で正しく動作しない問題を抱えていました(Citrixはタイムゾーンに関してかなり奇妙な(しかし高度な)ことをしています)が、C関数は正しく機能していました。

+0

ヘッドアップありがとう。 – ahmd0

+0

Windows上のgmtime関数は、DSTが有効かどうかを判断するために米国のルールを使用しているため、これらも信頼できるとは思わないと言います。 – Julian

+0

複数の国や大陸(西ヨーロッパ、東ヨーロッパ、ロシア、米国など)で使用されているアプリケーションで、C-time関数(gmtime、mktime、localtime、...)を使用していて正しく動作していますすべての場合において。私はCランタイムは、正しい時間を計算するためにレジストリに格納されているDST情報を使用するWindows関数を使用すると思います。 – Patrick

関連する問題