[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 メーリングリストの案内