2013-02-10 3 views
7

私はUTC(GMT + 0)タイムスタンプを含むデータベースを持っています。問題は次のとおりです。インディアナ州で発生した請求処理を指します。知っているかもしれないいくつかのようタイムゾーンルールが変更された場合、Javaで歴史的に正確な現地時間にどのようにマップするのですか?

、インディアナ...

  • (状態のほとんどはEST一年中た)全ての前に2006年夏時間を観察しませんでした。
  • がESTのまま2006年に投票されましたが、他の米国との夏時間の観測を開始します。
  • 2007年の規則が改訂されました。このデータベースのタイムスタンプは、政府の課金アクティビティを参照しているため、開始と終了のルールが

を変更するように米国連邦政府はサマータイムを改訂し、歴史的にされている現地時間として報告UTCタイムスタンプを持つことが実際には必要です監査の正確さを維持するために正確です。したがって、インディアナには3つのシナリオがあります。2006年以前のタイムスタンプは2006年から2007年のタイムゾーンルールとは全く異なるタイムゾーンルールを使用し、2007年以降のタイムゾーンルールは全く異なるタイムゾーンルールを使用します。このデータベースには、インディアナ以外のロケールのアクティビティが含まれていることが想像できます。そのため、状況はさらに複雑になります。

JavaカレンダーおよびTimeZone APIには、複数のタイムゾーンルールセットを持つオブジェクトをプログラマが作成できるクラスが含まれていないため、UTCタイムスタンプを歴史的に正確な現地時間に正しくマッピングするためには使用できません。具体的には、適用可能なタイムゾーン規則が変わります。

私はUTCタイムスタンプが一緒に保存することができるように、データベースを更新することができ
  • ...タイムゾーンのルールを変更してロケールで歴史的に正確な現地時間へのマッピングの問題に対処する方法について考えてきました

    ローカルタイムオフセットと夏時間オフセットを使用します。ここで問題となるのは、データベースのサイズが少し大きくなり、既存のデータベースが大きい場合は、すべてのテーブルを更新するには、オフラインのメンテナンスサイクルを延長する必要があります。

  • データベースは、特定のタイムスタンプに適した特定のタイムゾーンオブジェクトが各タイムスタンプとともに格納されるように更新できます。私はTimeZoneオブジェクトはかなり軽量だと思いますが、これは上記より柔軟ですが、タイムスタンプごとにオブジェクトを永続化する必要があるため、あまり好ましくありません。

  • 関心のあるロケールの歴史的に正確な規則のデータベースから適切なTimeZoneオブジェクトを構築するカスタムAPIを開発することができます。このソリューションは、前の2つのソリューションのストレージ要件の増加を、追加の処理の必要性で置き換えました。表示される必要があるすべてのタイムスタンプは、新しいオブジェクトを作成することを意味するか、少なくともオブジェクトプールから適切なオブジェクトとペアを作成することを意味します。さらに、タイムゾーンデータベースの作成と管理を意味します。 Javaの時刻とカレンダーAPIの制限は、あなたが、例えば、既存のSimpleTimeZoneオブジェクトを照会し、どのような晴天にそれを求めることはできません(それがあるべきよりも、本当に難しいこの問題へのエレガントな解決策を見つける行った

節約ルールは本当に面倒なコードを書かずに従います)。

私はちょうど誰かが前にこのような状況に対処しているかどうか、どのようにそれを処理したか尋ねたいと思います。

+0

私はJavaについて知らないけど、[Olson timezone database](http://www.iana.org/time-zones)を使っていると確信しています([tzdata -java Debianパッケージ](http://packages.debian.org/squeeze/tzdata-java))もしそうなら、あなたはha心配することはありません。 Olsonデータベースはすべての履歴ルールを処理し、正しい現地時間を提供する必要があります。 – Celada

+0

政治家の犯罪を取り除くためには一生懸命働かなければならないのはとても悲しいことです。 – irreputable

答えて

1

説明しているタイムゾーンデータベースはすでに存在します。これは、Olsonのzoneinfoデータベースと呼ばれ、1970年以降のすべての日付で正しく、it's available onlineです。

さらに、Javaのネイティブの日時APIはこのデータベースを使用します。あなたはjava.util.TimeZone.getTimeZone()を使用して、任意のタイムゾーンをロードし、オフセットを取得またはTimeZone.getOffset(long)を使用して、このオブジェクト(例えば、使用して変換を行うことができます。たとえば、あなたがインディアナ州の日付と時刻を変換する"America/Indiana/Indianapolis"ゾーンを読み込むと思います。

一つのことTimeZoneデータベースは実際にはそれが使用しているルールを照会しているので簡単にはできません。そのためには、tzファイルを直接調べる必要があると思いますが、ほとんどの場合、指定した日付のオフセットを取得するだけで十分です。

+0

とインディアナ内に複数のゾーンがあります:http://stackoverflow.com/questions/4065641/arizona-timezone-day-light-saving – irreputable

+0

右;インディアナポリスゾーンは8つの選択肢の1つです。 – duskwuff

+0

ヒストリーの特定の瞬間、つまり特定の時間に、変換を実行する方法やタイムゾーンオフセットを取得する方法の例をいくつか表示できますか? – Suma

関連する問題