afnf.net

PostgreSQLで「invalid value for parameter "TimeZone": "JST"」エラー

PostgreSQL Java 2015/08/30 20:38

現象

特定環境で、logbackのログ時間がUTCになってしまったので、デフォルトタイムゾーンを指定しました。すると、DB接続時に以下のようなエラーが。

2015-08-30 18:45:52,997 [http-nio-127.0.0.1-8080-exec-1] ERROR o.apache.tomcat.jdbc.pool.ConnectionPool - Unable to create initial connections of pool
org.postgresql.util.PSQLException: FATAL: invalid value for parameter "TimeZone": "JST"
  at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages
  at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl
  at org.postgresql.core.ConnectionFactory.openConnection

デフォルトタイムゾーンをJSTとすると、PostgreSQLサーバから拒否されるようです。

PostgreSQLのserverlogには以下が出力されれていました。

FATAL:  invalid value for parameter "TimeZone": "JST"

環境

  • JDK 8
  • Spring Boot 1.2.5
  • postgresql-9.4-1201-jdbc41.jar
  • PostgreSQL 9.3.4

切り分け

システムプロパティとして設定する方法-Duser.timezone=JSTと、Javaから設定する方法TimeZone.setDefault(TimeZone.getTimeZone("JST"));の両方で発生しました。

指定しない場合や、UTCを指定する場合は発生しません。

原因

PostgreSQLのTimeZoneにJSTが存在しないためです。

$ls /usr/local/pgsql/share/timezone/
Africa      CET      Egypt    GMT+0      Iran       MST7MDT  Poland     UTC
America     CST6CDT  Eire     GMT-0      Israel     Mexico   Portugal   Universal
Antarctica  Canada   Etc      GMT0       Jamaica    NZ       ROC        W-SU
Arctic      Chile    Europe   Greenwich  Japan      NZ-CHAT  ROK        WET
Asia        Cuba     Factory  HST        Kwajalein  Navajo   Singapore  Zulu
Atlantic    EET      GB       Hongkong   Libya      PRC      Turkey     posixrules
Australia   EST      GB-Eire  Iceland    MET        PST8PDT  UCT
Brazil      EST5EDT  GMT      Indian     MST        Pacific  US

JapanやAsia/Tokyoはあります。実際、user.timezone=Japanの場合は発生しません。

対処方法

上記のように存在するtimezoneを指定する方法と、cp -p Japan JSTしてしまう方法があります。後者の場合、PostgreSQLの再起動は不要です。

PostgreSQL Java 2015/08/30 20:38
comments (0)

blog-java2 engine (build:2017-08-10 17:37 JST)