C# で Npgsqlを使ってtimestamp with time zoneのデータをinsertしていて、
 
– クライアントソフト側のTimeZoneはちゃんとTokyo
– 引数で渡す時刻もちゃんとしている(型はDateTime)
– PostgreSQLのTimeZoneもTokyo(show timezone; で確認できる)
 
なのに、insertされた結果が9時間進んでいるという謎現象が起きて、しばらくはまったのでメモ。

https://www.npgsql.org/doc/types/datetime.html
を読むと、

A common mistake is for users to think that the PostgreSQL timestamp with time zone type stores the timezone in the database. 

って書いてあって、私のつたない英語力では、
 
「timestamp with timezoneはデータベースにtimezoneが保存されているといったな。あれはウソだ」(超意訳)
 
って衝撃の言葉と読める。
 
さらに
 
「NpgsqlDbType.TimestampTzを指定してローカルタイムゾーンなDateTimeなデータを送ると、送信する前に問答無用でタイムゾーンをUTCに変えちゃうもんね」
 
とかいう恐ろしい呪いの言葉が書かれている。
 
うそでしょ?
そんなことある?
 
と思いましたが目の前のテーブルには正確に9時間ずれたデータ。
とりあえず
 
NpgsqlDbType.Timestamp を使え
 
ということだそうです。