-
2026-01-10 PostgreSQLPostgreSQL バージョンアップ
PostgreSQL 18 でタイムゾーン省略形の扱いが変更されました(1)
はじめに
PostgreSQL では 'JST' や 'PST' といったタイムゾーンの省略形を日時演算で利用できます。
PostgreSQL 18 で、このタイムゾーンの省略形に関する扱いが変更されました。
PostgreSQL 17 以前の動作
PostgreSQL 17 以前の動作では、タイムゾーンの省略形に関しては、timezone_abbreviations パラメータを元に、PostgreSQL のインストールディレクトリにある share/timezonesets ディレクトリ内のファイルに定義された内容に基づいて解釈されていました。
つまり、PostgreSQL が独自に用意した情報をもとに、タイムゾーンの省略形を解釈する仕組みとなっています。
補足となりますが、Asia/Tokyo と、フルタイムゾーン名が指定された場合は、${PGHOME}/share/timezone ディレクトリ内にある IANA タイムゾーンデータベースの情報を利用して解釈されます。
PostgreSQL 18 以降の動作
PostgreSQL 18 以降は、タイムゾーンの省略形についても、IANA タイムゾーンデータベースの定義を優先して利用するようになりました。
これにより、国際標準で信頼性の高いタイムゾーン情報を利用できるようになり、他のシステムやソフトウェアとの一貫性も高まります。
簡単なまとめ
タイムゾーン省略形の扱いを、簡単な表にまとめると下記のようになります。
| データベースの種類 | 実際のディレクトリ | v17以前 | v18以降 |
|---|---|---|---|
| PostgreSQL 独自の省略形定義 | share/timezonesets/ | 利用する | 利用する(優先度:低) |
| IANA タイムゾーンデータベース(国際標準タイムゾーン定義) | share/timezone/ | 利用しない | 利用する(優先度:高) |
ソースコードの変更点
PostgreSQL 18 で変更があった箇所は、リリースノートから該当の変更点に git の diff へのリンクから確認できます。
該当の git の diff の URL は下記となります。
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7674c9fa
diff を確認いたしますと、色々と変更が発生していますが、src/timezone/localtime.c に新たに追加された pg_timezone_abbrev_is_known 関数内で IANA タイムゾーンデータベースの情報を参照しているようです。
そして PostgreSQL 独自データベースの情報を参照している処理の前に、この pg_timezone_abbrev_is_known 関数が呼び出されるような修正が発生しています。
src/backend/utils/adt/datetime.c の DecodeTimezoneAbbrev 関数の該当部部を下記に引用します。
/*
* See if the current session_timezone recognizes it. Checking this
* before zoneabbrevtbl allows us to correctly handle abbreviations whose
* meaning varies across zones, such as "LMT".
*/
if (session_timezone &&
TimeZoneAbbrevIsKnown(lowtoken, session_timezone,
&isfixed, offset, &isdst))
{
*ftype = (isfixed ? (isdst ? DTZ : TZ) : DYNTZ);
*tz = (isfixed ? NULL : session_timezone);
/* flip sign to agree with the convention used in zoneabbrevtbl */
*offset = -(*offset);
/* cache result; use strlcpy to truncate name if necessary */
strlcpy(tzc->abbrev, lowtoken, TOKMAXLEN + 1);
tzc->ftype = *ftype;
tzc->offset = *offset;
tzc->tz = *tz;
return 0;
}
if 文内の TimeZoneAbbrevIsKnown 関数内で pg_timezone_abbrev_is_known 関数が呼び出されています。
まとめ
簡単ではありますが、以上が PostgreSQL 18 で発生したタイムゾーン省略形に関する扱いの変更となります。
この変更は、ほとんどの日本語運用("Asia/Tokyo" や "JST")では大きな影響はありませんが
- IANA データベースに含まれない(または更新された)省略形を使用している場合
- 地域依存の省略形を使用している場合
などには、バージョンアップ後に挙動が変動する可能性があります。
バージョンアップ時には、自社システムやスクリプト内で使っているタイムゾーン省略形がどちらの定義で解釈されるか、念のため確認しておくと安心です。
次回以降の記事で、実際に PostgreSQL を動作させての挙動確認を行なった結果なども紹介したいと思います。