我正在嘗試使用 PerlDateTime用符號從另一天中減去一天。我可以輕松獲得介于兩者之間的日子:
sub delta_days {
my $date1 = shift;
my $date2 = shift;
my $d1 = str_to_date_object($date1);
my $d2 = str_to_date_object($date2);
return $d2->delta_days($d1)->delta_days();
}
say delta_days('2021-10-21', '1980-8-20');
say delta_days('1980-8-20', '2021-10-21');
但是這兩個呼叫都給出了區別 as 15037,沒有符號。
按照檔案https://metacpan.org/pod/DateTime
我懂了
# not DST
my $dt1 = DateTime->new(
year => 2003,
month => 5,
day => 6,
time_zone => 'America/Chicago',
);
# is DST
my $dt2 = DateTime->new(
year => 2003,
month => 11,
day => 6,
time_zone => 'America/Chicago',
);
my $dur = $dt2->subtract_datetime($dt1)->days();
我在How to make DateTime::Duration output only in days? 中檢查了一個類似的問題?但我不知道如何在那里獲得有符號的差異。
我怎樣才能得到一個標志的天數差異?
uj5u.com熱心網友回復:
兩個問題:如果您想要負偏移量,您將以錯誤的順序對日期進行減法,并且對于您正在測驗的日期subtract_datetime(),持續時間物件將有 0 天。
與此版本對比:
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
use DateTime;
use Data::Dumper;
# not DST
my $dt1 = DateTime->new(
year => 2003,
month => 5,
day => 6,
time_zone => 'America/Chicago',
);
# is DST
my $dt2 = DateTime->new(
year => 2003,
month => 11,
day => 6,
time_zone => 'America/Chicago',
);
say $dt1;
say $dt2;
my $dur = $dt1->subtract_datetime($dt2);
print Dumper({$dur->deltas});
運行時會產生
2003-05-06T00:00:00
2003-11-06T00:00:00
$VAR1 = {
'minutes' => 0,
'nanoseconds' => 0,
'months' => -6,
'seconds' => 0,
'days' => 0
};
請注意 -6 個月的偏移量。DateTime::Duration根據檔案,物件不會在月和日之間轉換,因此這看起來像是死胡同。
delta_days您首先查看的方法回傳實際天數差異,但如前所述,它是一個絕對值。如果第一個日期在第二個日期之前,您可以添加一個檢查以將其轉換為負數:
my $days = $dt1->delta_days($dt2)->in_units('days');
$days *= -1 if $dt1 < $dt2;
say $days; # Prints -184
以及您的delta_days()功能的變體:
sub delta_days {
my $date1 = shift;
my $date2 = shift;
my $d1 = str_to_date_object($date1);
my $d2 = str_to_date_object($date2);
return $d1->delta_days($d2)->in_units('days') * ($d1 < $d2 ? -1 : 1);
}
say delta_days('2021-10-21', '1980-8-20');
say delta_days('1980-8-20', '2021-10-21');
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/330916.html
