2014-02-17 56 views
0

只以下的代碼表示,像這樣的月和日的區別:在Perl中使用日期:: MANIP計算天數的差異

0:2:0:5: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"; 
} 

回答

3

我不熟悉日期:: MANIP,但我覺得另一種方式來做到這一點是使用Time::Piece解析您的字符串,做任何你既然喜歡taking the difference of two Time::Piece object returns a Time::Seconds object

以下示例將顯示當前時間和硬編碼時間的差異並以天顯示。

#!/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"; 
+0

想到會工作,謝謝你的提示! – user3147432

+1

另外,'Time :: Piece'是Perl 5版本10以來的核心模塊,不需要安裝。 – Borodin

1

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在幾天內輸出一個嚴格的三角洲,所以其他模塊是要走的路。

+0

我仍然可以從中學習。學習如何更好地收緊代碼總是很好的,謝謝! – user3147432