从今天起减去天数,然后在

时间:2019-07-15 12:45:54

标签: perl datetime

以下情况。

我有一个名为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天,又如何比较之后的两个日期?

2 个答案:

答案 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。