簡単な答えは次のとおりです。
- my.cnfに「default-time-zone=utc」を追加します
- コードでは、ユーザーの日付を表示する場合を除いて、常にUTCで「考え」ます
-
JDBCを使用して日付またはタイムスタンプを取得/設定する場合は、常に、UTCに設定されたCalendarパラメーターを使用してください。
resultset.getTimestamp( "my_date"、Calendar.getInstance(TimeZone.getTimeZone( "UTC")));
- サーバーをNTPと同期するか、データベースサーバーのみに依存して時刻を通知します。
長い答えはこれです:
データベースやクライアントコードの日付とタイムゾーンを処理するときは、通常、次のポリシーをお勧めします。
-
UTCタイムゾーンを使用するようにデータベースを構成する 、サーバーのローカルタイムゾーンを使用する代わりに(もちろんUTCでない限り)。
-
その方法は、データベースサーバーによって異なります。 MySQLの手順は、次の場所にあります: http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html 。基本的に、これをmy.cnfに書き込む必要があります:default-time-zone =utc
-
このようにして、データベースサーバーをどこにでもホストし、ホストの場所を簡単に変更し、より一般的には、あいまいさなしにサーバーの日付を操作できます。
- 本当にローカルタイムゾーンを使用したい場合は、データベースにあいまいな日付があると本当に悪夢になる可能性があるため、少なくとも夏時間をオフにすることをお勧めします。
- たとえば、テレフォニーサービスを構築していて、データベースサーバーで夏時間を使用している場合は、問題が発生します。「2008- 10-2602:30:00"から"2008-10-2602:35:00 "は、実際には5分または1時間5分(夏時間が10月26日の午前3時に発生したと仮定)で呼び出されました。>
-
-
アプリケーションコード内では、ユーザーに日付を表示する場合を除いて、常にUTC日付を使用してください。
- Javaでは、データベースから読み取るときは、常に次を使用します。
タイムスタンプmyDate=resultSet.getTimestamp( "my_date"、Calendar.getInstance(TimeZone.getTimeZone( "UTC")));
- これを行わないと、タイムスタンプはUTCではなくローカルのタイムゾーンにあると見なされます。
-
サーバーを同期するか、データベースサーバーの時間のみに依存します
-
1台(またはそれ以上)のサーバーにWebサーバーがあり、他のサーバーにデータベースサーバーがある場合は、それらのクロックをNTPと同期することを強くお勧めします。
-
または、1台のサーバーだけに依存して現在の時刻を通知します。通常、データベースサーバーは時間を求めるのに最適なサーバーです。つまり、次のようなコードは避けてください。
prepareStatement =connection.prepareStatement( "UPDATE my_table SET my_time =?WHERE [...]");
java.util.Date now =new java.util.Date(); // 現地時間! :-(
preparedStatement.setTimestamp(1、new Timestamp(now.getTime()));
int result =prepareStatement.execute();- 代わりに、データベースサーバーの時間に依存します:
prepareStatement =connection.prepareStatement( "UPDATE my_table SET my_time =NOW()WHERE [...]");
int result =prepareStatement.execute(); -
お役に立てれば! :-)