Java8 以降、java.time.LocalDate と java.time.LocalDateTime の最小値/最大値は、
LocalDate.MIN → -999999999-01-01 LocalDate.MAX → +999999999-12-31 LocalDateTime.MIN → -999999999-01-01T00:00 LocalDateTime.MIN → +999999999-12-31T23:59:59.999999999
である。
MySQL データベースのTIMESTAMP型は、このような言語の数学的な最小値と最大値は
データを作れません。
JSTのdatabase の場合、UTCエポック時刻 +9:00 で 1970-01-01 09:00:00
の時刻でデータを作ろうとすると、
ERROR 1292: 1292: Incorrect datetime value:
+1秒の 1970-01-01 09:00:01 ならデータを作れる。
これはつまり、Java エポックの時刻(JST)
LocalDateTime.ofEpochSecond(3600*9L, 0, ZoneOffset.UTC)
や、
OffsetDateTime.of(LocalDate.of(1970, 1, 1), LocalTime.of(0, 0, 0), ZoneOffset.UTC)||<
は、ダメで
LocalDateTime.ofEpochSecond(3600*9L + 1, 0, ZoneOffset.UTC)
OffsetDateTime.of(LocalDate.of(1970, 1, 1), LocalTime.of(0, 0, 1), ZoneOffset.UTC)||<
ならばOKなのである。
2038年問題の 2038-01-19 03:14:07 UTC でも同様のことが、TIMESTAMP では、
ERROR 1292: 1292: Incorrect datetime value:
のエラーを引き起こします。
解決策として、DATETIME型を用いることなのですが、
DATETIME型の場合、、
0000-01-01 00:00:00 9999-12-31 23:59:59
という値を入れることができて、
Javaでは、
OffsetDateTime.of(LocalDate.of(0, 1, 1), LocalTime.of(0, 0, 0), ZoneOffset.UTC) OffsetDateTime.of(LocalDate.of(9999, 12, 31), LocalTime.of(14, 59, 59), ZoneOffset.UTC)
でデータをセットできます。