Perl在特定日期的十天之前获取日期

时间:2020-05-27 13:20:02

标签: perl date

我需要输入一个比输入日期早10天的日期。

这是我的脚本-(引用自戴夫(Dave)的answer

#!/usr/bin/perl

use strict;
use warnings;

use Time::Local;
use POSIX 'strftime';

my $DATE = $ARGV[0];
( $DATE =~ /(....)(..)(..)/ );

my ($day, $mon, $yr) = ( $3, $2, $1 );

my $midday = timelocal(0, 0, 12, $day, $mon, $yr); 

my $midday_before = $midday - (10 * 24 * 60 * 60);

my $required_date = strftime('%Y-%m-%d', localtime($midday_before));

print "10 days to before ".$yr."-".$mon."-".$day." is : $required_date\n";

但是我的输出看起来像这样,我很困惑:

$ perl get_date.pl 20200527
10 days to before 2020-05-27 is : 2020-06-17

我期待2020-05-17。但是它给了我2020-06-17,比我输入的日期早了20天。

我不想使用DateTime来实现这一目标。由于安装模块时存在权限问题。

1 个答案:

答案 0 :(得分:3)

您需要仔细阅读Time::Local的文档。它包括:

值得特别注意的预期范围 提供的值。该月中某天的值是实际值 日期(即1..31),而月份是自 一月(0..11)。这与从中返回的值一致 localtime()gmtime()

在您复制的代码中,我使用localtime()来获取月份(以及日期的其他部分),这给了我0到11之间的整数。在代码中,您将值解析为输入字符串中的数字,这将为您提供1到12之间的数字。因此,您需要从月份中减去1,然后再将其传递给timelocal()

这是编写更好的日期/时间工具(例如DateTimeTime::Piece)的原因之一。请不要忽略它们。

更新:时间::片版本:

#!/usr/bin/perl

use strict;
use warnings;

use Time::Piece;
use Time::Seconds;

my $today = Time::Piece->strptime($ARGV[0], '%Y%m%d');
my $then = $today - (10 * ONE_DAY);

my $fmt = '%Y-%m-%d';

print '10 days to before ', $today->strftime($fmt),
      ' is : ', $then->strftime($fmt), "\n";