在我的perl程序中,我计算保修结束日期的保修开始日期差异为3年。以下是我到目前为止编写的代码块:
use Time::ParseDate;
use DateTime;
use POSIX;
use DateTime::Duration;
my $warranty_expiration_string = "20-May-07";
my $epoch = parsedate($warranty_expiration_string);
my $warranty_expiration = strftime "%D", localtime($epoch); # returns: 05/20/07
如何从$warranty_expiration
到$warranty_start
日期扣除3年?
我试过了,
$warranty_start->subtract(DateTime::Duration->new('years' => 3));
..但它不起作用。
答案 0 :(得分:5)
我不明白所有不同的日期/时间模块是混合的。你只需要其中一些,而不是全部。如果你想使用DateTime进行数据计算,你需要这样的东西:
use DateTime;
use DateTime::Format::Strptime;
my $dateparser = DateTime::Format::Strptime->new( pattern => '%d-%b-%y' );
my $warranty_expiration = $dateparser->parse_datetime($warranty_expiration_string);
my $warranty_start = $warranty_expiration->clone->subtract( years => 3);
大多数DateTime :: Format :: *模块都与DateTime一起使用,如果可以,我更喜欢使用它们。
您可能还想了解有关正在进行的DateTime项目以及推荐模块列表的更多信息:
答案 1 :(得分:2)
$warranty_expiration
不是DateTime,它是一个字符串。你想做类似的事情:
my $warranty_expiration = DateTime->from_epoch(
epoch => $epoch,
time_zone => 'local',
);
my $warranty_start = $warranty_expiration->clone->subtract(years => 3);
然后您可以将$warranty_expiration->strftime("%D")
和$warranty_start->strftime("%D")
用作格式化字符串。此外,如果您使用其中一个DateTime::Format
模块而不是Time::ParseDate
,则会直接从解析器返回DateTime
,而不必使用from_epoch
。
答案 2 :(得分:-1)
无需为此实例化DateTime::Duration
,因为计算方法直接期望这些参数:
use DateTime;
my $dt = DateTime->now->subtract(years => 3);
print "$dt\n";
结果:
2009-08-30T14:36:27