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
検証
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に生えているメソッド