为什么我不能减3次?

时间:2014-03-13 12:36:12

标签: perl time

刚刚更新了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::PieceTime::Seconds执行int和模数,所以我不需要吗?

3 个答案:

答案 0 :(得分:10)

您无法从持续时间中减去时间。例如,九分钟减去一点是没有意义的。

$t1等于10:15am$t2等于17:305: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 % 6051分钟。


更新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运算符未定义的-对象。