刚刚更新了OP,因为我做错了。
此脚本
#!/usr/bin/perl
use warnings;
use strict;
use Time::Piece;
my $t1 = Time::Piece->strptime( '10:15', '%H:%M' );
my $t2 = Time::Piece->strptime( '17:30', '%H:%M' );
my $t3 = Time::Piece->strptime( '7:24', '%H:%M' );
my $t = $t2 - $t1 - $t3;
print int($t->hours) . ":" . $t->minutes%60 . "\n";
将输出
Can't use non Seconds object in operator overload at /usr/lib/perl/5.14/Time/Seconds.pm line 65.
正确的答案是-0:09
即。 0小时和-9分钟。
问题
如何减去3次?
我可以Time::Piece
或Time::Seconds
执行int
和模数,所以我不需要吗?
答案 0 :(得分:10)
您无法从持续时间中减去时间。例如,九分钟减去一点是没有意义的。
您$t1
等于10:15am
,$t2
等于17:30
或5:30pm
。所以$t2 - $t1
是他们之间的时间,或7.25小时。
现在,您尝试从该结果中减去$t3
7:24am
。但是7.25小时减去7:24 am是持续时间减去一天中的时间,并且无法完成。这就是你收到消息的原因
Can't use non Seconds object
,因为您试图从Time::Piece
对象(持续时间)中减去Time::Seconds
个对象(一天中的某个时间)。
<强>更新强>
如果你在持续时间工作,那么你需要Time::Seconds
模块。
use strict;
use warnings;
use Time::Seconds;
my $t1 = Time::Seconds->new(10 * ONE_HOUR + 15 * ONE_MINUTE); # 10:15
my $t2 = Time::Seconds->new(17 * ONE_HOUR + 30 * ONE_MINUTE); # 17:30
my $t3 = Time::Seconds->new( 7 * ONE_HOUR + 24 * ONE_MINUTE); # 7:24
my $t = $t2 - $t1 - $t3;
print $t->minutes, "\n";
<强>输出强>
-9
或者您可能希望从00:00
对象中减去午夜Time::Piece
,就像这样
use strict;
use warnings;
use Time::Piece;
use constant MIDNIGHT => Time::Piece->strptime('00:00', '%H:%M');
my $t1 = Time::Piece->strptime( '10:15', '%H:%M' );
my $t2 = Time::Piece->strptime( '17:30', '%H:%M' );
my $t3 = Time::Piece->strptime( '7:24', '%H:%M' );
$_ -= MIDNIGHT for $t1, $t2, $t3;
my $t = $t2 - $t1 - $t3;
print $t->minutes;
也输出-9
。
注意您使用$t->minutes % 60
中的模数无法得到您想要的结果,因为-9 % 60
为51
分钟。
更新2
另一个选择是编写一个使用前面任一选项的辅助例程。此示例具有子例程new_duration
,它使用Time::Piece->strptime
来解析传入的字符串,然后在返回生成的Time::Seconds
对象之前减去午夜。
use strict;
use warnings;
use Time::Piece;
use Time::Seconds;
use constant MIDNIGHT => Time::Piece->strptime('00:00', '%H:%M');
my $t1 = new_duration('10:15');
my $t2 = new_duration('17:30');
my $t3 = new_duration( '7:24');
my $t = $t2 - $t1 - $t3;
print $t->minutes;
sub new_duration {
Time::Piece->strptime(shift, '%H:%M') - MIDNIGHT;
}
<强>输出强>
-9
答案 1 :(得分:1)
这句话:
my $t = $t2 - $t1 - $3;
应该是
my $t = $t2 - $t1 - $t3;
答案 2 :(得分:1)
$t2 - $t1
返回Time::Seconds
运算符未定义的-
对象。