PerlのDateTimeモジュールで秒の差分をほしい場合はDurationオブジェクトとか使わないでepochの引き算でよい
スポンサードリンク
Perlの時刻を扱う定番モジュールでDateTimeっていうのがあります。今回、2つの日付の差を取って秒数を得たいと思いまして、おそらくDateTimeモジュールを使う人はほとんどいているだろうっていう
iandeth. - Perlで日付・時間を操作 - DateTime モジュールの使い方 [iandeth.dyndns.org]
を参考にしまして、
2つの日時の差分を調べる [iandeth.dyndns.org]
という見出しのところに書いてあるdelta_ms()とin_units('seconds')を使ってみたらばうまくいかない。
結論から言うと、秒だったら普通にepochでいいってことです。次にソースを示す。
use strict;
use warnings;
use DateTime::Format::HTTP;
delta (
DateTime::Format::HTTP->parse_datetime('2010-05-15T17:32:00'),
DateTime::Format::HTTP->parse_datetime('2010-05-15T17:32:51'),
);
delta (
DateTime::Format::HTTP->parse_datetime('2010-05-15T17:32:00'),
DateTime::Format::HTTP->parse_datetime('2010-05-18T17:32:01'),
);
sub delta {
my $dt1 = shift;
my $dt2 = shift;
my $delta1 = $dt1->delta_ms($dt2)->in_units('seconds');
my $delta2 = $dt2->epoch - $dt1->epoch;
print "$dt1と$dt2の差の秒数は、\n";
print "delta_ms:$delta1 epoch:$delta2\n\n";
return;
}
実行結果:
$ perl time.pl 2010-05-15T17:32:00と2010-05-15T17:32:50の差の秒数は、 delta_ms:51 epoch:51 2010-05-15T17:32:00と2010-05-18T17:32:00の差の秒数は、 delta_ms:1 epoch:259201 $
これは普通にdelta_msの使い方が悪い。分と秒が出てくるんですね。この例だと、in_units('seconds')でわざわざ秒の桁のみ取り出しているから、0~59までしか出ない。だから、何分何秒、ていうのではなくて、本当に累計の秒のみ欲しいのだったらエポックの比較でよいってことですね。
あと、ここら辺も参考になる。
DateTime::Duration - daily dayflower [d.hatena.ne.jp]
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3222





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)


コメントする