将字符串“20-May-07”转换为日期并进行操作

时间:2012-08-30 14:32:20

标签: perl datetime

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

..但它不起作用。

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