2009-07-17 8 views

答えて

3

GetTimeZoneInformationが必要です。

戻り値を調べて、夏時間がオンになっているかどうかを検出できます。また、夏時間と夏時間に切り替えるためのルールを含む構造体を埋め込みます。この構造体をいっぱいにしてUTC形式の任意の時刻を指定すると、その時刻が夏時間か標準時刻かを比較的簡単に計算できます。

+0

Linuxに相当するものはありますか?または、それをカプセル化するlibをうまく処理しますか?ブーストを確認します;) – neuro

+1

移行日の履歴を考慮に入れたい場合は注意してください。例えば。米国とオーストラリアは、最近、夏時間と通常時間の間で変更された日付と、2008年のタイムスタンプとは異なる規則のもとで2003年からのタイムスタンプが変更されました。 –

+0

Boostには、Boost.Date_Time [1]タイムゾーンデータベースなどがあります。 私はそれを使用していないので、私はその品質を保証することはできません。 [1] http://www.boost.org/doc/libs/1_39_0/doc/html/date_time.html –

0

でも、GetTimeZoneInformationとGetDynamicTimeZoneInformationは、の現在のタイムゾーンの設定を返します。現在のTZ(つまり、サーバーがどこにあるか)がチェックしたいTZでない場合はどうなりますか?

私はチェックアウト用の書籍を予約しているサーバーアプリケーションを持っているとしましょう。 「今すぐチェックしたい」または「今後datetimeにチェックアウトする必要があります」と言うことができます。チェックアウト時間は、ユーザーの現地時間で入力され、保存前にUTCに変換されます。ユーザーがチェックアウトのリストを取得すると、時間は表示のためにローカルに変換されます。

サーバーはニューヨークにあり、米国の標準DST規則のもとで運用されているものとします。タイムゾーンは東部アメリカに設定されています。現在は7/27/2009 15:30ですので、DSTはONです。

ニューヨークのユーザーは現地の日時を入力します。 ETからUTCへの変換 - 問題ありません。彼らは将来の日付を入力します。私は上記の2つのAPI呼び出しのうちの1つを使用してそれを把握します。

ただし、シドニーのユーザーはチェックアウトを予約したいと考えています。彼女はシドニーの現地時間帯に比べて2009年12月13日18時25分にチェックアウトを要求します。ローカルのTZ情報を使用することはできません - シドニーとNYは同じDSTルールに従っていません。シドニーの現在のTZ情報を読み込んで、任意の日付がDSTかどうかを調べるにはどうすればよいですか?

0

Win7およびServer2008/R2用のMS-Windowsには、新しい(ただしまだ不完全な)メソッドがあります。 KB 2731771を参照してください。ICUとBoost :: localeも参照してください。 Windowsルーチン(GetTimeZoneInformationForYear)では、最低年を取得する限り、UTCを変換している必要があります。幸運にも、私が知っている1月1日の周りにタイムゾーンがシフトしていません。 SystemTimeToTzSpecificLocalTime(Ex)を使用すると、ローカルシステムのタイムゾーンとは異なるタイムゾーンに適切に変換されたローカルタイムを取得できます。 これらのメソッドがないと、レジストリをスキャンして適切なタイムゾーン情報と動的情報を読み込み、SystemTimeToTzSpecificLocalTimeを呼び出す必要があります。 TZの設定がオーストラリア向けであっても、米国のDSTルールを使用するようなシステム(Windowsのようなもの)が多い(ほとんどの場合は間違っている)ものがあるため、_tzsetやlocaltimeのようなものは注意してください。

WindowsとLinuxの両方で、時間のためのすべての動的/歴史的DST規則を考慮に入れて、UTCtoLocal(const char * tzName、time_t inTime、struct tm * outTime)指定されたゾーン。 tzNameは、あなたが実行しているシステムに応じて、 "Central Standard Time"や "America/Chicago"のような適切な名前を取ることができます。のような2つの呼び出しのステップを許可したいと思うこともあります。 UTCtoLocal(const TIME_ZONE_INFORMATION * inTZInfo、time_t inTime、struct tm * outTime) これは、システムタイムゾーン情報をロードし、ライブラリがローカル/ UTC変換を実行するときに発生します。

関連する問題