sql >> データベース >  >> RDS >> Mysql

java.util.DateをUTC/GMTタイムゾーンのMySQLタイムスタンプフィールドに保存するにはどうすればよいですか?

    簡単な答えは次のとおりです。

    • my.cnfに「default-time-zone=utc」を追加します
    • コードでは、ユーザーの日付を表示する場合を除いて、常にUTCで「考え」ます
    • JDBCを使用して日付またはタイムスタンプを取得/設定する場合は、常に、UTCに設定されたCalendarパラメーターを使用してください。

      resultset.getTimestamp( "my_date"、Calendar.getInstance(TimeZone.getTimeZone( "UTC")));

    • サーバーをNTPと同期するか、データベースサーバーのみに依存して時刻を通知します。

    長い答えはこれです:

    データベースやクライアントコードの日付とタイムゾーンを処理するときは、通常、次のポリシーをお勧めします。

    1. 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時に発生したと仮定)で呼び出されました。>
    2. アプリケーションコード内では、ユーザーに日付を表​​示する場合を除いて、常にUTC日付を使用してください。

      • Javaでは、データベースから読み取るときは、常に次を使用します。

      タイムスタンプmyDate=resultSet.getTimestamp( "my_date"、Calendar.getInstance(TimeZone.getTimeZone( "UTC")));

      • これを行わないと、タイムスタンプはUTCではなくローカルのタイムゾーンにあると見なされます。
    3. サーバーを同期するか、データベースサーバーの時間のみに依存します

      • 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();

    お役に立てれば! :-)



    1. MySQL-MINを検索しますが、ゼロは検索しません

    2. Javaでタイムスタンプを日付に変換する

    3. MySQLでUTF8文字を保存する方法

    4. varchar2(n BYTE | CHAR)デフォルト->CHARまたはBYTE