从今天日期减去天数,然后比较

poi*_*isn 2 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");
Run Code Online (Sandbox Code Playgroud)

输出量

03/12/2018
Run Code Online (Sandbox Code Playgroud)

在那之后,我想得到今天的日期-14天。但是,这是我的两个问题之一。我尝试了很多事情,但找不到任何适合我的真正解决方案。

my $day14 = DateTime->now();
$day14 -= (2 * ONE_WEEK);
Run Code Online (Sandbox Code Playgroud)

错误:

无法从DateTime对象中减去1209600(DateTime = HASH(0x6f2d84))。只能从DateTime对象中减去DateTime :: Duration或DateTime对象。

现在第二个问题是,我想比较这两个日期,并查看文件日期是否在范围内。

my $cmp = DateTime->compare($chars, $day14);
Run Code Online (Sandbox Code Playgroud)

错误:

参数“ 15/07/2019”不是数字等式(==)中的数字

一个DateTime对象只能与另一个DateTime对象进行比较(03/12/2018,15/07/2019)。

那么,如何从今天的日期减去14天,又如何比较之后的两个日期?

Dav*_*oss 5

You're slightly muddling up two Date/Time ecosystems that don't work well together.

You can do this using Time::Piece and 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');
Run Code Online (Sandbox Code Playgroud)

Output:

03/12/2018
19/11/2018
Run Code Online (Sandbox Code Playgroud)

Or you can do it using DateTime and friends.

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');
Run Code Online (Sandbox Code Playgroud)

Output:

03/12/2018
19/11/2018
Run Code Online (Sandbox Code Playgroud)

As for your last question, you can compare either Time::Piece objects or DateTime objects using the standard Perl comparison operators (<, ==, >=, etc). But you have to compare two objects of the same type.

  • @poisn,如果希望异常,在错误的输入中包含可能有用的错误消息,而不是仅仅包含一个错误消息,请在传递给`DateTime :: Format :: Strptime-&gt; new`的选项列表中添加`on_error =&gt;'croak'`。返回`undef`。 (2认同)