[pgsql-jp: 39980] Re: 8.4 で timestamp の time zone 変換が
中上
tech.ichiro @ gmail.com
2009年 8月 27日 (木) 09:48:55 JST
中上です。
岡崎さん、情報ありがとうございます。
>> この日本の標準時に関する部分は1888年
> <http://ja.wikipedia.org/wiki/1888%E5%B9%B4>(明治21年)1 月1日
> <http://ja.wikipedia.org/wiki/1%E6%9C%881%E6%97%A5>から適用された。
PostgreSQLのソースコードを見てみると、
src/timezone/data/asia というファイルに以下の記述がありました。
確かに 1887 Dec 31 15:00u を境に時間帯が変わったように読めます。
------------------------
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Tokyo 9:18:59 - LMT 1887 Dec 31 15:00u
9:00 - JST 1896
9:00 - CJT 1938
9:00 Japan J%sT
------------------------
また、PostgreSQL8.3.7の同じファイルにも同じ記述があり、
それでいて8.3.7の振る舞いが8.4と異なっているということは、
8.4で時間帯変換(?)の実装が変わったということだと推測しています。
設定か何かで8.3.7と同じ振る舞いをするようには出来ないでしょうか?
------------------------
SELECT '1887-12-31 14:59:59'::timestamp without time zone AT TIME ZONE 'UTC';
8.4では⇒ 1888-01-01 00:18:58+09:18:59
8.3.7では⇒ 1887-12-31 23:59:59+09
------------------------
余談ですが、アプリケーション側は.NETで作っていて、
DateTime.Parse()というメソッドに +09:18:59 という時間帯表現を
渡すと例外が発生してしまいます。
そんなわけで、DB側は timestamp WITHOUT time zone を使うか、
SELECT時に'UTC'に変換してしまう方が無難なのかなと考えています。
pgsql-jp メーリングリストの案内