M.C.P.C.

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


| トップページ |

2010年5月15日 18:27

PerlのDateTimeモジュールで秒の差分をほしい場合はDurationオブジェクトとか使わないでepochの引き算でよい

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

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]

投稿 大野 義貴 [Perl] | |

トラックバック(0)

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

コメントする