AWS RDS で mysql を使っていたのだが、以前はタイムゾーンを変えることができなかった。そのため、無理矢理 JST で日付や時刻をセットしている WEB アプリがあった。(Amazon RDS データベースインスタンスのタイムゾーンを変更する方法によると今はサーバのタイムゾーンを変えられるらしい。)

この環境で動く Java の WEB アプリで mysql connector/j をバージョン 5 系からバージョン 8 系に変更したところ、時刻が正しく UTC でセットされるようになってしまった。

(current_timestamp などを指定すると UTC でセットされるだろうから、正しくないのを承知で)無理矢理 JST でセットしてほしいのだが、接続文字列を jdbc:mysql://〜&serverTimezone=Asia/Tokyo のようにすればよいようだ。

リファレンス: connector/j reference configuration properties

Changes in Connection Properties によると、8系では、5系にあった、useLegacyDatetimeCode プロパティは削除された。

念のため、ソースも見てみたが、動きとしては(詳細まで追ってはいないが)、次のように動作するのではないだろうか。

  1. サーバのタイムゾーン(time_zoneパラメータか?)を取得してそのタイムゾーンに変換しようとする。
  2. serverTimezone が指定されていると、その値をサーバのタイムゾーンとみなして変換しようとする。

私の場合は、実際そのように動作していた。