Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中使用Date::Manip计算天数差异_Perl_Date - Fatal编程技术网

在perl中使用Date::Manip计算天数差异

在perl中使用Date::Manip计算天数差异,perl,date,Perl,Date,下面的代码仅表示月份和天数的差异,如下所示: 0:2:0:5:0:0:0:0 所以它是有效的,但是我想知道$ADDate的总天数可能会有很大的变化。希望这很简单,我只是完全错过了怎么做 #!/usr/bin/perl use Date::Manip 6.42; my $ADDate = "20131211000820.0Z"; my $var; my @val; my $diff; calc_period($ADDate = "20131211000820.0Z"); sub calc_

下面的代码仅表示月份和天数的差异,如下所示:

0:2:0:5:0:0:0:0

所以它是有效的,但是我想知道$ADDate的总天数可能会有很大的变化。希望这很简单,我只是完全错过了怎么做

#!/usr/bin/perl

use Date::Manip 6.42;

my $ADDate = "20131211000820.0Z";
my $var;
my @val;
my $diff;

calc_period($ADDate = "20131211000820.0Z");

sub calc_period
{
$ADDate =~ s/^([\d][\d][\d][\d])([\d][\d])([\d][\d])/$1-$2-$3/gs;
$ADDate =~ s/.........$//gs;
$today = ParseDate("today");

$beginning = ParseDate($ADDate);
$end = ParseDate($today);
$delta = DateCalc($beginning,$end,\$err,1);

#$delta =~ s/([\d+][:][\d+]):.*$/$1/gs;


print "$delta\n";
print "$ADDate\n";
}

我不熟悉Date::Manip,但我认为另一种方法是使用它来解析您的字符串,并使用它执行任何您喜欢的操作

以下示例将显示当前时间和硬编码时间的差异,并以天为单位显示

#!/usr/bin/perl

use strict;
use warnings;

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

my $d = "20131211000820.0Z";

my $t = Time::Piece->strptime($d, "%Y%m%d%H%M%S.0Z");
my $now = Time::Piece->localtime();

my $diff = Time::Seconds->new($now - $t);

print $diff->days, "\n";

NigoroJr已经给了你一个答案。但是,仅供参考,以下是我将如何清理您最初提供的代码:

#!/usr/bin/perl

use Date::Manip 6.42;

use strict;
use warnings;

calc_period("20131211000820.0Z");

sub calc_period {
    my $date = shift;
    $date =~ s/^(\d{4})(\d{2})(\d{2}).*/$1-$2-$3/;

    my $beginning = ParseDate($date);
    my $end = ParseDate("today");
    my $delta = DateCalc($beginning, $end, \my $err, 1);

    #$delta =~ s/([\d+][:][\d+]):.*$/$1/gs;

    print "$delta\n";
    print "$date\n";
}
最大的区别在于函数和作用域变量的正确使用,以及正则表达式的简化


我找不到一个干净的方法来让Date::Manip在几天内输出一个严格的增量,所以另一个模块是可行的。

我仍然可以从中学习。学习如何更好地收紧代码总是很棒的,谢谢!另外,
Time::Piece
自Perl5版本10以来一直是一个核心模块,不需要安装。