SQLiteのTIMESTAMP型のフィールド値をPerlのDateTimeモジュールで日本時間に変換
ログ格納をSQLiteでやろうとするとctimeをTIMESTAMP型にして勝手に格納されるようにすると便利なんですけれどもこれはMySQLのTIMESTAMPと同じ書式で格納されて、当然ながらタイムゾーンがUTCになっています。
つうわけで、これを日本時間にして取り扱う戦略としては、DateTime::Format::MySQLを使うといいなーていうのが1点目。
次に、DateTime::Formatでは、生成したオブジェクトにタイムゾーン指定しないと、勝手に'UTC'になるなんてことはなく、曖昧なままのよう。だから、一度明示的に $dt->set_time_zone ( 'UTC' ); でタイムゾーンをUTCに指定してあげないと、時刻を正確に示しているオブジェクトにはならないっていう点が2点目。
use DateTime::Format::MySQL; my $timestamp = '2008-02-19 12:00:00'; my $dt = DateTime::Format::MySQL ->parse_datetime( $timestamp ) ->set_time_zone( 'UTC' ); print $dt->set_time_zone('local') ->strftime('%m/%d %H:%M');
実行結果:
02/19 21:00
DateTime::Format::MySQL - Parse and format MySQL dates and times - search.cpan.org
狐の王国 PerlのDateTimeモジュールでset_time_zoneすると9時間ずれる件
を参考にしました。