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にまで戻す必要があるというのが違和感ありますが、そんなもののようです。
こんな感じで、タイムゾーンの指定は難しいよ、というお話でした。



(社)日本印刷産業連合会(猿渡智会長)は、「第13回エコプロダクツ2011」で実施したGPキャラクター愛称人気投票の集計結果を発表した。






