MySQLのtimestamp形式の日付文字列をPerlで日付として取り扱いたい。いままではDateTimeを使っていたけれども、今後の事を考えるとPerl 5.10で標準となっているTime::Pieceを使うのがよいだろう。ということでテストしてみたが。
テストしたのは、MySQLのtimestamp形式 "2012-03-01 00:00:00"(GMT) を、日本の時刻として読めるISO 8601形式の日付文字列(JST+09:00)として表示させるというもの。
FileName: datetime-timepiece.pl
use strict; use warnings; use Time::Piece::MySQL; use DateTime::Format::MySQL; my $datestrings = '2012-03-01 00:00:00'; my $dt = DateTime::Format::MySQL ->parse_datetime( $datestrings ) ->set_time_zone('GMT') ->set_time_zone('Asia/Tokyo'); # DateTime::Format::MySQLを使わない場合は、 #use DateTime::Format::Strptime; #my $strp = DateTime::Format::Strptime->new(pattern => '%F %T',time_zone => 'GMT'); #my $dt = $strp->parse_datetime( $datestrings )->set_time_zone('Asia/Tokyo'); my $tp = localtime Time::Piece->from_mysql_timestamp( $datestrings )->epoch ; # Time::Piece::MySQLを使わない場合は、 #my $tp = localtime Time::Piece->strptime( $datestrings, '%Y-%m-%d %H:%M:%S')->epoch ; print "DateTime > $dt\n"; print "Time::Piece> ".$tp->datetime."\n"; __END___
実行結果:
$ perl datetime-timepiece.pl DateTime > 2012-03-01T09:00:00 Time::Piece> 2012-03-01T09:00:00 $
勝手知ったるDateTimeは、日付文字列をparseした瞬間は、タイムゾーンなどないまっさら状態なので、1回目のset_time_zone('GMT')で、"2012-03-01 00:00:00" はGMTにおける時刻であると設定したうえで、2回目のset_time_zone('Asia/Tokyo')で、日本のタイムゾーンを設定しました。set_time_zoneが2つあるというのが違和感ありますが、だいたいこんなもんです。
一方、Time::Pieceでは、parseして得られた時刻はGMTになっているから、一回epochに戻してからlocaltimeの引数として指定することで、タイムゾーンを設定しています。epochにまで戻す必要があるというのが違和感ありますが、そんなもののようです。
こんな感じで、タイムゾーンの指定は難しいよ、というお話でした。