我有一个时间差的字符串,如:
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)
我知道DateTime,但解析输入字符串的简单方法是什么?我确信这是一个更好的方式:
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";
}
如何在当前日期添加解析的天数,小时数,分钟数?
答案 0 :(得分:8)
如果使用reverse
来避免检查格式呢?
my ($m, $h, $d) = reverse split /:/, $str;
要将其添加到当前日期,只需使用DateTime:
print DateTime->now->add(days => $d // 0,
hours => $h // 0,
minutes => $m);
答案 1 :(得分:-1)
解析可以完成一次,但分支基于否。 tokes是无法避免的。以下是示例实现。
$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" }