4

ユーザーが管理する場所を含む db テーブルにタイムゾーン情報を追加する必要があります。データは主に Java コードからアクセスされますが、タイムゾーン情報を理解する必要がある PL/SQL および Win32 (Delphi) コードもあります。

java.util.TimeZone の id を使用するのは簡単に思えます。Javaはそれを(明らかに)簡単に変換できます。Hibernateには組み込みのサポートがあり、明らかにOracleもこれらのタイムゾーンIDを理解しています:

select TZ_OFFSET('Pacific/Marquesas') from dual.

問題は、タイムゾーン ID が Windows タイムゾーン DB と互換性がないように見えることです。たとえば、java.util.timezone id "Pacific/Marquesas" (-09:30) は Windows のタイムゾーン ピックリストにありません。レジストリにはまったく含まれていません。見る

\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

ここでは、-09:00 または -10:00 のいずれかのみを選択できます。では、このようにタイムゾーンを保存する場合、Windows (Java なし) で実際のオフセット/DST 情報を取得するにはどうすればよいでしょうか? うまくいけば、これが変更されるたびに最新の状態に保つ必要があるマッピング テーブルを必要としないことを願っています。JavaタイムゾーンIDよりもうまく機能する、世界的に受け入れられている標準はありますか?

アップデート

タイムゾーン情報は、データベースの DATE 列と組み合わせて使用​​されます。これらの列には、ローカルの日付/時刻の値が含まれています。場所をこれらの値に関連付けることができる場合、その場所のタイムゾーンにより、必要に応じて日付/時刻の値を UTC またはその他のタイムゾーンに変換できます。

DATE の代わりに TIMESTAMP_TZ データ型または類似のものの方が適切であることを認識しています。ただし、これにはデータの移行が必要になり (TZ が再度必要になります)、データで動作するレガシー アプリケーションではサポートされません (多くのコードが変更されない限り)。値を UTC に変換する必要がある場合、問題はほとんど同じです。

要するに、DATE の値を現地時間で保持する必要がありますが、その一部について、それがどの TZ を意味するかを知る必要があります。

4

2 に答える 2

6

本当の答えではないにしても、少し背景を説明できます。

多くのシステムは、タイムゾーン データのOlson実装を使用しています。したがって、これらの名前は多くのシステムで機能します (ほとんどの Unix、Java、Oracle だと思います)。マイクロソフトは独自のことを行っています。

ウィキペディアのリンクの一番下に、Windows の世界へのマッピングへの参照があります。

幸運を!

于 2009-02-24T19:22:33.053 に答える
2

これは最善の方法ではないことは承知していますが、あなたの場合はそれで十分かもしれません。すべての要件を知らなければ、私にはわかりません。

タイムゾーン情報を何に使用する必要がありますか?正しいオフセットで時刻を表示し、タイムゾーンの名前も表示するだけですか?

引き続きJavaを使用して、Javaを使用してユーザーが選択したタイムゾーンを検索することにより、ユーザーのオフセットを判別できます。ユーザーがデータベースにログインするたびに、現在のオフセットは何ですか。次に、他のアプリがこの情報を調べて、時刻のフォーマット方法を決定できます。

これは、定期的にログインするユーザーがこれを行う必要があるユーザーであることを前提としています。そうでない場合は、毎日のジョブを実行して、Javaで各ユーザーのタイムゾーンを検索し、現在有効なオフセットを記録することができます。

ハッキー、同意しましたが、私が見る他の唯一の方法は、マッピングを維持することです。また、マッピングがないタイムゾーンを誰かが選択するとどうなりますか?

于 2009-02-24T20:09:38.743 に答える