javaでMySQL Connector/J 8.0を使ってdate型カラムのデータを取得する際、
java.lang.IllegalArgumentException: HOUR_OF_DAY: 0 ->1
というエラーが出る場合があります。実はある特定の日付が格納されている場合にこのエラーが出ます。
特定の日付とはこちらの4つ。
1948-05-02
1949-04-03
1950-05-07
1951-05-06
何の日付かと言うと、過去に日本でサマータイムが導入されたことがある年のサマータイム開始日です。どうしてエラーが起きるかというと、1つ目の例で言うと、1948-05-02の00:00:00から00:59:59はこの世に存在しないからです。つまりdate型カラムで1948-05-02が格納されている場合、DBには1948-05-02 00:00:00に変換されるデータがありますが、その時間が当時の日本では存在しないのでエラーが出るわけです。
この場合、JDBCの接続URLを次のように修正する必要があります。
serverTimezone=Asia/Tokyo
↓
serverTimezone=GMT%2B9
このように、タイムゾーンIDではなくオフセットで指定するとサマータイムを認識させないで済みます。