TECH BLOG
技術ブログ
  • 2026-03-20 PostgreSQLPostgreSQL バージョンアップ

    PostgreSQL 18 でタイムゾーン省略形の扱いが変更されました(2)

PostgreSQL 18 におけるタイムゾーン省略形の挙動確認

前回の記事( https://www.insight-ltd.co.jp/tech_blog/postgresql/pg_versionup/951/ )では、PostgreSQL 18 でタイムゾーン省略形(JST など)の解釈順序が変更され、IANA タイムゾーンデータベースが優先されるようになった点について整理しました。

本記事では、PostgreSQL 17 と PostgreSQL 18 を実際に起動し、タイムゾーン省略形を含む日時を解釈させた際の挙動を比較した結果を紹介します。

検証環境

検証に利用した環境は下記となります。

  • PostgreSQL 17.7
  • PostgreSQL 18.1
  • Ubuntu 24.04

PostgreSQL 18 から挙動が変動するケースを検証

PostgreSQL 17 以前と 18 で挙動が変わるのは、現在のタイムゾーンの IANA データベースと PostgreSQL 独自定義でオフセットが異なるタイムゾーン省略形(CST や IST など)を含む日時を、timestamptz や timetz に変換しようとする場合です。
つまり、オフセットが一致している場合や IANA データベースに定義がない場合は、PostgreSQL 17 と 18 で挙動は変わりません。
たとえば、タイムゾーン Asia/Tokyo で JST を使用する場合、PostgreSQL 独自定義と IANA データベースはオフセットが一致しているため、挙動は変わりません。
一方、タイムゾーン Asia/Shanghai で CST を使用する場合、PostgreSQL 独自定義と IANA データベースはオフセットが不一致なため、挙動が変わります。

実際に SQL を実行して挙動を確認します。

SELECT '2025-07-01 00:00 CST'::timestamptz;

これを実際に実行した結果が下記となります。

PostgreSQL 17.7 の結果
SET TIME ZONE 'Asia/Tokyo';
SET

SELECT '2025-07-01 00:00 CST'::timestamptz;
      timestamptz       
------------------------
 2025-07-01 15:00:00+09
(1 row)

SET TIME ZONE 'Asia/Shanghai';
SET

SELECT '2025-07-01 00:00 CST'::timestamptz;
      timestamptz       
------------------------
 2025-07-01 14:00:00+08
(1 row)
PostgreSQL 18.1 の結果
SET TIME ZONE 'Asia/Tokyo';
SET

SELECT '2025-07-01 00:00 CST'::timestamptz;
      timestamptz       
------------------------
 2025-07-01 15:00:00+09
(1 row)

SET TIME ZONE 'Asia/Shanghai';
SET

SELECT '2025-07-01 00:00 CST'::timestamptz;
      timestamptz       
------------------------
 2025-07-01 00:00:00+08
(1 row)

結果確認

Asia/Tokyo での挙動

PostgreSQL 17 と 18 のどちらも、タイムゾーン Asia/Tokyo でタイムゾーン省略形 CST を指定した場合には、どちらも「2025-07-01 15:00:00+09」という結果になりました。
これは、Asia/Tokyo の IANA データベースに CST の定義が存在しないため、PostgreSQL 18 でも PostgreSQL 独自定義を参照し、その結果 UTC-6(米国中部標準時)として解釈されたため、PostgreSQL 17 と同じ結果になりました。

Asia/Shanghai での挙動

一方、タイムゾーン Asia/Shanghai でタイムゾーン省略形 CST を指定した場合には、PostgreSQL 17 と 18 で結果が異なりました。

  • PostgreSQL 17 の結果: 2025-07-01 14:00:00+08
  • PostgreSQL 18 の結果: 2025-07-01 00:00:00+08

PostgreSQL 17 では、CST は PostgreSQL 独自定義の UTC-6(米国中部標準時)として解釈されました。
PostgreSQL 18 では、タイムゾーン Asia/Shanghai の IANA データベースに CST の定義が存在するため、UTC+8(中国標準時)として解釈されました。
この挙動の違いにより、同じ SQL 文でも PostgreSQL のバージョンとタイムゾーン設定によって、6時間の時差が発生する結果となりました。

まとめ

PostgreSQL 17 と 18 で、現在のタイムゾーン設定(session_timezone)によってタイムゾーン省略形の解釈が変わることを、実際に SQL を実行して確認しました。
今回の検証で確認したとおり、日本国内でのシステムで Asia/Tokyo や JST を利用している場合には、特に影響することのない変更点となります。
CST のように複数の地域で異なる意味を持つ省略形を使用する場合は、バージョンアップ時に挙動が変動していないかを確認することが推奨となります。
一方で、CST や IST のような地域依存のタイムゾーン省略形を使用している場合には、PostgreSQL 18 へのバージョンアップによって挙動が変わる可能性があります。
そのような環境では、該当する省略形を使用している SQL の実行結果を、バージョンアップ前後で確認しておくと安心です。

CATEGORY

ARCHIVE

PostgreSQLに関するご相談は
株式会社インサイトまで
お気軽にお問い合わせください。

CONTACT