我需要输入一个比输入日期早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
来实现这一目标。由于安装模块时存在权限问题。
答案 0 :(得分:3)
您需要仔细阅读Time::Local的文档。它包括:
值得特别注意的预期范围 提供的值。该月中某天的值是实际值 日期(即1..31),而月份是自 一月(0..11)。这与从中返回的值一致
localtime()
和gmtime()
。
在您复制的代码中,我使用localtime()
来获取月份(以及日期的其他部分),这给了我0到11之间的整数。在代码中,您将值解析为输入字符串中的数字,这将为您提供1到12之间的数字。因此,您需要从月份中减去1,然后再将其传递给timelocal()
。
这是编写更好的日期/时间工具(例如DateTime和Time::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";