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時間ずれる件

を参考にしました。