如何找出当地时间和用户定义时间之间的时间差异?

时间:2016-12-21 12:03:32

标签: perl

#!/usr/bin/perl

sub parkingcharge {

    sub exittime
    {
        ($sec, $min, $hour) = localtime();
        print "exit time:$hour:$min:$sec\n";
    }

    my $exit  = exittime();
    my $entry = "9:10:8";

    print "\nvehicle entry time is :$entry\n";
    print "\nvehicle exit time is :$exit\n";

    my $parkingCharge = ($entry - $exit);

    print "\ntotal parking charge is : $parkingCharge\n";
}

parkingcharge();

输出显示如下

exit time:5:46:57

vehicle entry time is :9:10:8

vehicle exit time is :1

total parking charge is : 8

我想在Perl车辆管理计划中找到停车费。费率是每小时2美元,所以我想找到输入时间和退出时间之间的差异,以小时为单位乘以2.我写的代码会产生错误的结果。

如何以小时计算时间差异?

1 个答案:

答案 0 :(得分:1)

您可以使用Perl附带的Time::Piece。它为您提供了一种方便的方法来将日期解析为Time :: Piece对象,这些对象基本上是具有语法糖的epoch时间戳。关于他们的好处是你可以在数学中使用它们,你会得到几秒钟。

因为你只有时间,我们需要在进入和退出时间都有相同的日期。一种方法是检查今天的日期并在两个变量中使用它。但是更容易将其排除在外。 Time :: Piece会假设它是1970-01-01,这很好,因为我们不在乎。只要你不能停放过夜,两个时间戳都有相同的日期,这一点非常重要。

use strict;
use warnings;
use Time::Piece;

my $entry = Time::Piece->strptime( '9:10:8', '%H:%M:%S' );

我们使用the strptime method来解析输入时间。第二个参数是placeholders的模式。 %H是24小时制表示的小时,%M是分钟,%S是秒。这也可以在没有前导零的情况下工作。

如果您1970-01-01 09:10:08,我们现在的参赛日期为Thu Jan 1 09:10:08 1970print $entry

接下来我们需要获得退出时间。

my ( $sec, $min, $hour ) = localtime;
my $exit = Time::Piece->strptime( "$hour:$min:$sec", '%H:%M:%S' );

因为在标量上下文中仅使用localtime会给我们今天的日期,所以我们必须做一个额外的步骤。你的代码已经有了这一刻的秒,分和小时。我们只是以正确的格式将其用作字符串,并将其以strptime的形式提供给$entry,就像我们对Thu Jan 1 14:46:56 1970所做的那样。现在我们有了退出时间戳,在我写这篇文章的时候是my $duration = $exit - $entry; my $duration_in_hours = $duration / 60 / 60;

获取持续时间是一个简单的减法问题。把它转换成几小时只是60分钟,60分钟。

$duration_in_hours

我现在5.61333333333333my $fee_started_hours = int( $duration_in_hours + 1 ) * $hourly_fee; 。如果您希望人们为每个开始时间付费,您必须进行整理。

my $fee_full_hours = int( $duration_in_hours ) * $hourly_fee;

我宁愿只支付整整几个小时的停车时间,所以我想要更多地停车。

template