M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2012年2月29日 23:41

PerlのDateTimeとTime::Pieceでのタイムゾーン指定の仕方の比較

このエントリーをはてなブックマークに追加 mixiチェック

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にまで戻す必要があるというのが違和感ありますが、そんなもののようです。

こんな感じで、タイムゾーンの指定は難しいよ、というお話でした。

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3877

コメントする