DateTimeでtimezoneの設定をしたりしたときに、うまく整理できなくてはまったのでメモ。
今回はDateTimeでset_timezoneを利用したときにどのような仕様で時間をずらすのかという部分とDateTime::Format::MySQLの仕様を理解できていなかったために、MySQLからデータを取ってきたときにはまってしまった。
仕様(?)
DateTimeオブジェクトはtimezoneを設定したときに以下の規則で時間をずらしている。
- DateTimeのtimezoneがfloatingの時にtimezoneをセットしても、時間は変換されない。つまりその時のfloatingにおける時間を設定したtimezoneの時間とみなす。
- DateTimeのtimezoneがfloating以外の時にtimezoneをセットすると、時間はそれらの差分の分変化する。例えばtimezoneがUTCの時にAsia/Tokyoにセットすると、9時間分ずれる。
またDateTime::Format::MySQLの場合は以下のような規則になっている。
- DateTime::Format::MySQLでparseしたときはfloating timezoneになったDateTimeオブジェクトを返す
例
DateTimeオブジェクトの一つ目の仕様は以下のコード実行してみると分かる。
use strict; use warnings; use DateTime; my $dt = DateTime->now(time_zone => 'floating'); warn $dt; $dt->set_time_zone('Asia/Tokyo'); warn $dt;
DateTimeオブジェクトの2つ目の仕様は以下のコード実行してみると分かる。
use strict; use warnings; use DateTime; my $dt = DateTime->now(time_zone => 'UTC'); warn $dt; $dt->set_time_zone('Asia/Tokyo'); warn $dt;