dorapon2000’s diary

忘備録的な。セキュリティとかネットワークすきです。

Perlの1秒差のdelta_daysの理解

PerlでDateTimeの日付差分を求めるとき、delta_daysメソッドを使います。しかし、このdelta_daysメソッドが日付部分だけを見て1日と出しているのか、秒数もみて24時間の差があるときに1日と出すのかググっても調べてる記事がありませんでした。自分が記録に残しておきます。

検証環境

結論

delta_daysは日付部分しか見ていない。

  • 2/24 23:59と2/25 00:00はdelta_daysで1日として返る
  • 2/25 00:00と2/25 00:01はdelta_daysで0日として返る
  • 2/24 23:59と2/26 00:00はdelta_daysで2日として返る

基本知識

  • DateTimeとDateTimeの差期間を求めるにはDateTimeに生えているdelta_daysを使う
  • DateTime#delta_daysの返り値はDateTime::Duration
  • DateTime::Durationにもdelta_daysメソッドがあり、返り値は日付期間を表すint

検証

github.com

use 5.32.1;
use warnings;
use utf8;

use DateTime;
use DateTime::Format::Strptime;

my $strp_YmdHMS = DateTime::Format::Strptime->new(
    pattern   => '%Y-%m-%d %H:%M:%S',
    locale    => 'ja',
    time_zone => 'local',
);
my $dt_0224_59 = $strp_YmdHMS->parse_datetime('2023-02-24 23:59:59');
my $dt_0225_00 = $strp_YmdHMS->parse_datetime('2023-02-25 00:00:00');
my $dt_0225_01 = $strp_YmdHMS->parse_datetime('2023-02-25 00:00:01');
my $dt_0226_00 = $strp_YmdHMS->parse_datetime('2023-02-26 00:00:00');

say $dt_0224_59->delta_days($dt_0225_00)->delta_days; # 1
say $dt_0225_00->delta_days($dt_0225_01)->delta_days; # 0
say $dt_0224_59->delta_days($dt_0226_00)->delta_days; # 2
  • 1回目のdelta_dayはDateTimeに生えているメソッドで、2回目のdelta_daysはDateTime::Durationに生えているメソッド