2012-05-21 111 views
3

我有像一個時間差的字符串:Perl的時間解析和差計算爲「加天:小時:分鐘」

12:03:22 <- where 
^^^ 
| | +minutes 
| +hours 
+days 

強制性僅可以省略分鐘,小時,天,但在這裏可以是例如120:30,所以120小時30分鐘。

需要計算的日期和時間NOW +差,因此,例如:

when now is "May 20, 13:50" and 
the string is "1:1:5" 
want get as result: "2012 05 21 14 55" (May 21, 14:55) 

我知道日期時間,但什麼是最簡單的方式解析輸入字符串?我敢肯定,這裏有更好的辦法:

use _usual_things_; 
my .... 
if($str =~ m/(.*):(.*):(.*)/) { 
    $d = $1; $h = $2; $m = $3; 
} 
elsif($str =~ m/(.*):(.*)/) { 
    $h = $1; $m = $2; 
} elsif ($str =~ m/\d+/) { 
    $m = $1; 
} 
else { 
    say "error"; 
} 

如何添加到正確的日期解析天,小時,分鐘?

回答

8

如何使用reverse來避免檢查格式?

my ($m, $h, $d) = reverse split /:/, $str; 

把它添加到當前日期,只使用日期時間:

print DateTime->now->add(days => $d // 0, 
         hours => $h // 0, 
         minutes => $m); 
+0

太棒了! :)在3分鐘內打電話! :) – jm666

+0

這是一個很好的。 – tuxuday

+0

唯一的缺點:當$ d未定義時(例如對於字符串2:30)DateTime抱怨__ DateTime :: Duration :: new的'days'參數(undef)是'undef',它不是允許的類型:__ – jm666

-1

解析可以做一次,但根據分支上沒有。無法避免。這是示例實現。

$Str = '12:03:22' ; 

@Values = ($Str=~/\G(\d\d):?/g) ; 

print "error with input" if not @Values; 

if(@Values == 3) { print "Have all 3 values\n" } 
elsif(@Values == 2) { print "Have 2 values\n" } 
相關問題