0

在我的 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));

..但它没有用。

4

3 回答 3

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 项目和推荐模块列表的信息:

于 2012-08-30T14:48:06.103 回答
2

$warranty_expiration不是日期时间,它是一个字符串。你想做这样的事情:

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直接从解析器返回 a 而不必使用from_epoch.

于 2012-08-30T14:38:30.743 回答
-1

无需为此实例化DateTime::Duration,因为计算方法直接期望这些参数:

use DateTime;
my $dt = DateTime->now->subtract(years => 3);
print "$dt\n";

结果:

2009-08-30T14:36:27
于 2012-08-30T14:37:17.500 回答