2009-08-12 4 views
3

私は長い間この問題に直面していました。多くのことを無駄に試したことがあります。問題は次のようになります。さまざまなタイムゾーンでのMySQLの日付問題

ユーザーが入力した日は '2009-08-12'です。それはdbに適切に格納されます。

GMT + 530タイムゾーンでは、日付も正しく表示されます。しかし、タイムゾーンをGMT + 1に変更すると、日付は '2009-08-11'と表示されます。つまり、1日後の日付が表示されます。

ご意見、ご提案、ご協力をお待ちしております。

おかげ

NAIT

答えて

5

日はおそらくDATETIMETIMESTAMPとして格納され、2009-08-12 00:00:00 +0530

が​​に変換され、それはあなたに与え2009-08-11 19:30:00 +0100

MySQLさんDATETIME保存しませんあなたのタイプがDATETIMEなら、それは確かにタイムスタンプと共にタイムゾーンですy日付を変換するデータベースアクセス層。

MySQLのタイプはUTCに時間を格納し、照会するとクライアントのタイムゾーンに変換されます。

1

なぜこれが起こっている@Quassnoiを説明しているが、それを解決する方法は、カレンダーのパラメータを取るjava.sql.PreparedStatementjava.sql.ResultSet上の様々な方法を使用することです - などjava.sql.PreparedStatement.setDate(int, Date, Calendar)のようなメソッド、java.sql.ResultSet.getDate(int, Calendar)を、

私のアドバイスを希望データベースの日付(通常はUTC)を表すために使用される標準のタイムゾーンを選択し、上記の方法を使用して任意の変換を実行します。

もちろん、データベースと同じタイムゾーンでクライアントを標準化することができれば、さらに優れたデータベースとなり、日付が表示されたときに単純に変換を実行することができます。

3

この問題は非常に広く見られます。たとえば、Martin Fowlerの発言があります。

根本的な問題は、Javaの日付クラスが物理的な量のような日付/時刻を扱うことです。具体的で不変な瞬間の表現です。

これは、ほとんどの人が気にして時間について考える方法とは一致しないという問題があります。典型的な談話では、人々は固定観念として '2009-08-01 18:00'を考える。問題は、そのような表現に付けられたタイムゾーンがないことです。したがって、実際には特定の瞬間を表すわけではありません。

これは多くのアプリケーションで引き続き混乱する原因です。 Javaでは常に暗黙的または明示的にタイムゾーンを使用しますが、データベースは通常、日付/時刻とともにタイムゾーン情報を格納しません。したがって、Javaは、Dateオブジェクトを作成するときに想定されるタイムゾーンを追加する必要があります。これは、値をDateオブジェクトに変換するときにJDBCドライバによって行われます。このようなコードがサーバー上で実行される場合、想定されるタイムゾーンは、クライアント/エンドユーザーによって使用されるタイムゾーンとしばしば一致しません。

唯一の答えは、Javaコードが「標準」タイムゾーンを使用していることを確認することです。

0

クォーラム式を使ってクォーツと同様の問題が発生しました。スケジュールされたジョブが間違った時間値で保存されました。アプリケーションがホストされているサーバータイムゾーンを自分のローカルタイムゾーン値に調整して問題が修正されました。

関連する問題