3

Windows マシンで現地時間を UTC に変換できる必要があります。これを行うと主張するSystemTimeToTzSpecificLocalTime APIを見つけましたが、その説明を読んだところ、次のことがわかりました。

SystemTimeToTzSpecificLocalTime 関数は、次の条件下で現地時間を正しく計算しない場合があります。

  • タイム ゾーンは、古い年と新しい年で異なる UTC オフセットを使用します。
  • 変換する UTC 時刻と計算された現地時刻の年が異なります。

MS に対する私の最初の修辞的な質問は、「信頼できる API を作成するのはどれくらい難しいですか?」です。

そして、実際の質問 — どうすれば 100% の時間で動作するようになりますか? (そして、その API が示唆するものとは異なります。)

4

2 に答える 2

5

あなたの両方の質問に対する答えは、それは本質的に不可能だということです。これが、コンピューター サイエンスの専門家が現地時間の扱いを嫌う傾向にある理由の 1 つです。

交絡の問題の例をいくつか示します。また、現在、夏時間のルールがあるとしても、それが 10 年後にどうなるかを知る方法はありません。タイム ゾーンの境界は移動することがあるため、現在が太平洋時間であることがわかっているだけでは、85 年前のタイム ゾーン オフセットが何であったかを判断するには不十分な場合があります。現在、将来どのうるう秒が挿入されるか、または挿入されないかを知る方法はありません。

可能な状況に陥った場合は、特定のケースでそれらの操作を可能にする特定の状況でコーディングする必要があります。提供される操作は一般化されており、使用できるケースを制限することなく、「通常は正しい」結果を提供します。

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

于 2012-04-16T21:25:45.687 に答える
3

DST 期間は特定の地域で変更されることがあるため、過去と未来のすべての場合で正しいものを記述することは困難です。

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

于 2012-04-16T21:32:43.987 に答える