【发布时间】:2014-12-31 11:35:41
【问题描述】:
我想使用DateTime::Format::Duration 添加两个持续时间。
这是我的代码
my $format = DateTime::Format::Duration->new(
pattern => '%H:%M:%S,%3N'
);
my $dur1 = $format->format_duration('01:59:58,923');
my $dur2 = $format->format_duration('05:01:02,456');
my $total = $dur1->add_duration( $dur2 );
print "\nDuration : " . $total;
当我执行时,我得到了错误
Can't call method "deltas" without a package or object reference at D:/Strawberry/perl/site/lib/DateTime/Format/Duration.pm line 131.
我期望的结果应该是格式:hh:mm:ss,sss。 (n.b. 两个持续时间的总和不超过 24 小时)
编辑 1
my $dur1 = $format->parse_duration('01:59:58,923');
my $dur2 = $format->parse_duration('05:01:02,456');
my $total1 = $dur1->add_duration( $dur2 );
my $total2 = $dur1 + $dur2;
print "\nTotal Duration 1: " . $format->parse_duration($total1);
print "\nTotal Duration 2: " . $format->parse_duration($total2);
这是我得到的输出:
总持续时间 1:DateTime::Duration=HASH(0x2be8564)
总时长 2:DateTime::Duration=HASH(0x2be6d74)
编辑 2:
这是我的新代码:
my $dur1 = $format->parse_duration('01:59:51,923');
my $dur2 = $format->parse_duration('05:21:02,456');
my $total = $dur1->add_duration( $dur2 );
my ($h, $m, $s, $ns) = $total->in_units(qw( hours minutes seconds ));
my $ns = ( $total )->nanoseconds; # delta_ms loses these.
if ( $ns >= 1000 ) {
$ns = $ns - 1000;
$s = $s + 1;
}
# print $ns ."\n\n";
my $final = sprintf '%d:%02d:%02d,%03.0f', $h, $m, $s, $ns;
print $final;
显然,它完成了这项工作。我想知道您对此有何看法。
编辑 3
例如执行此代码后:
my $dur1 = $format->parse_duration('00:00:50,339');
my $dur2 = $format->parse_duration('00:00:58,686');
my $total = $dur1->add_duration( $dur2 );
my ($h, $m, $s) = $total->in_units(qw( hours minutes seconds ));
my $ns = ( $total )->nanoseconds;
if ( $ns >= 1000 ) {
$ns = $ns - 1000;
$s = $s + 1;
}
# 00:00:02,339 00:00:00,686
my $duration = sprintf '%d:%02d:%02d,%03.0f', $h, $m, $s, $ns;
print "\nDuration : " . $duration;
这是输出:Duration : 0:00:109,025。这似乎很明显,因为DateTime::Duration->add_duration 没有进行“内部”转换。
【问题讨论】:
-
format_duration函数将DateTime::Duration对象作为参数,但您提供了一个字符串'01:59:58,923' -
请问如何将其转换为
DateTime::Duration对象? -
您正在使用
format_duration来解析一个字符串。很明显,并且文档清楚地解释了,您应该使用parse_duration来做到这一点。另请注意,您将添加 923 和 456 纳秒,即 1.379 微秒,或 0.000001379 秒。如果你使用相同的模式%3N来格式化,你总是会得到.000 -
感谢@Borodin 的回复。我刚刚编辑了我的帖子以显示我遇到的错误。抱歉,我是 Perl 新手...
-
@Borodin : 你能看看我的 EDIT 2 吗?
标签: perl datetime time duration