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

Perl在特定日期之前获取日期到十天,perl,date,Perl,Date,我需要得到一个日期,这是10天前输入的日期 这是我的脚本-参考从戴夫的 但我的输出是这样的,我很困惑: $ perl get_date.pl 20200527 10 days to before 2020-05-27 is : 2020-06-17 我期待着2020-05-17。但它给了我2020-06-17,比我输入的日期提前了20天 我不想用DateTime来实现这一点。由于安装模块时存在权限问题。您需要更仔细地阅读文档。它包括: 值得特别注意的是,预期的 提供的值。该月某日的值为实际值

我需要得到一个日期,这是10天前输入的日期

这是我的脚本-参考从戴夫的

但我的输出是这样的,我很困惑:

$ 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..31,而月份是自 1月0日至11日。这与从中返回的值一致 localtime和gmtime

在您复制的代码中,我使用localtime获取月份和日期的其他部分,这给了我一个介于0和11之间的整数。在代码中,解析输入字符串中的值,得到一个介于1和12之间的数字。因此,在将月份传递给timelocal之前,您需要从月份中减去1

这就是为什么要编写更好的日期/时间工具(如and)的原因之一。请不要忽视它们

更新: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";

您需要更仔细地阅读文档。它包括:

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

在您复制的代码中,我使用localtime获取月份和日期的其他部分,这给了我一个介于0和11之间的整数。在代码中,解析输入字符串中的值,得到一个介于1和12之间的数字。因此,在将月份传递给timelocal之前,您需要从月份中减去1

这就是为什么要编写更好的日期/时间工具(如and)的原因之一。请不要忽视它们

更新: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";

谢谢戴夫的回复。是否有任何方法可以使用标准Perl安装附带的模块来实现这一点。正如您提到的POSIX&Time::Local.vkk05:如果您使用的是比5.10~2007更新的perl,则Time::Piece应该包含在核心perl中。@VKKK05:我很困惑。我已经详细解释了如何修复现有代码,使其正常工作。但正如Jim所说,您应该已经安装了Time::Piece。很抱歉造成混淆。我的Perl版本是Perl,v5.10.1*是为x86_64-linux-thread-multi构建的,当我执行上面的代码时,它说在@INC@INC contains中找不到Time/Piece.pm:…@VKKK05,您的安装已中断/部分,因为Time::Piece是Perl 5.10的一部分,这是一个非常旧的Perl版本。感谢Dave的响应。是否有任何方法可以使用标准Perl安装附带的模块来实现这一点。正如您提到的POSIX&Time::Local.vkk05:如果您使用的是比5.10~2007更新的perl,则Time::Piece应该包含在核心perl中。@VKKK05:我很困惑。我已经详细解释了如何修复现有代码,使其正常工作。但正如Jim所说,您应该已经安装了Time::Piece。很抱歉造成混淆。我的Perl版本是Perl,v5.10.1*是为x86_64-linux-thread-multi构建的,当我执行上面的代码时,它说在@INC@INC contains中找不到Time/Piece.pm:…@vkkk05,您的安装已中断/部分,因为Time::Piece是Perl 5.10的一部分,这是一个非常旧的Perl.Re版本,因为在安装模块时存在权限问题,所以安装模块不需要特殊权限。因为在安装模块时存在权限问题,所以安装模块不需要特殊权限