以下情况。
我有一个名为2018_12_03_FileName.log的文件。现在我从文件(2018_12_03)中获取日期。
我想将字符串转换为DateTime对象,它也可以工作。
$chars =~s/_//g;
$chars = Time::Piece->strptime("$chars", "%Y%m%d");
$chars = $chars->strftime("%d/%m/%Y");
输出
03/12/2018
在那之后,我将无法得到今天的日期-14天。但是,这是我的两个问题之一。我尝试了很多事情,但是找不到对我有用的真正解决方案。
my $day14 = DateTime->now();
$day14 -= (2 * ONE_WEEK);
错误消息
无法从DateTime对象中减去1209600 (DateTime = HASH(0x6f2d84))。只有DateTime :: Duration或DateTime 可以从DateTime对象中减去该对象。
第二个问题是,我想比较这两个日期,看看文件日期是否在范围内。
my $cmp = DateTime->compare($chars, $day14);
错误消息2
参数“ 15/07/2019”不是数字等式(==)处的数字
一个DateTime对象只能与另一个DateTime对象进行比较 (03/12/2018,15/07/2019)。在
那么如何从今天起减去14天,又如何比较之后的两个日期?
答案 0 :(得分:5)
您正在弄混两个无法很好地协同工作的日期/时间生态系统。
您可以使用Time :: Piece和Time :: Seconds。
use feature 'say';
use Time::Piece;
use Time::Seconds;
my $chars = '2018_12_03';
my $tp = Time::Piece->strptime($chars, '%Y_%m_%d');
my $date14 = $tp - (2 * ONE_WEEK);
say $tp->strftime('%d/%m/%Y');
say $date14->strftime('%d/%m/%Y');
输出:
03/12/2018
19/11/2018
或者您可以使用DateTime和朋友来做。
use feature 'say';
use DateTime;
use DateTime::Format::Strptime;
my $date_parser = DateTime::Format::Strptime->new(
pattern => '%Y_%m_%d',
on_error => 'croak',
);
my $chars = '2018_12_03';
my $dt = $date_parser->parse_datetime($chars);
my $date14 = $dt->clone->subtract( weeks => 2 );
say $dt->strftime('%d/%m/%Y');
say $date14->strftime('%d/%m/%Y');
输出:
03/12/2018
19/11/2018
关于最后一个问题,您可以使用标准Perl比较运算符(<
,==
,>=
等)比较Time :: Piece对象或DateTime对象。但是您必须比较两个相同类型的对象。
答案 1 :(得分:1)
还有另一个选择,Time::Moment使日期数学变得非常简单:
use strict;
use warnings;
use Time::Moment;
my $chars = Time::Moment->from_object(Time::Piece->strptime("$chars", "%Y%m%d"));
my $day14 = Time::Moment->now_utc->minus_days(14)->at_midnight;
print $day14->strftime('%d/%m/%Y');
可以将这些对象与DateTime和Time :: Piece等普通运算符进行比较。请记住,由于您只关心一天而不是一天中的时间,因此所有数学运算都应根据相同的时区进行,当然,最简单的当然是UTC。