Perl脚本时差计算关闭一小时

时间:2016-03-13 23:25:31

标签: perl datetime unix

由于某种原因,我用来计算两个给定日期/时间的时差的以下脚本是一小时。不确定它是否与夏令时有关。谁知道为什么?

如果可能,我想知道如何在计算中添加毫秒数。

#!/usr/bin/perl

use strict;
use warnings;

use Time::Local;

sub str2epoch {
    my $str = shift;
    my ($date, $time) = split(/\s+/, $str);
    my ($yr, $mon, $dd) = split(/\-/, $date);
    my ($hr, $min, $sec) = split(/:/, $time);
    $yr -= 1900;
    $mon -= 1;

    $hr -= 24 if ($hr == 24);

    if ($sec =~ m/PM/ && $hr < 12){
            $hr += 12;
            $sec =~ s/PM//;
    } elsif ($sec =~ m/PM/ && $hr == 12) {
            $sec =~ s/PM//;
    }

    if ($sec =~ m/AM/ && $hr == 12) {
            $hr -= 12;
    } elsif ($sec =~ m/AM/ && $hr < 12) {
            $sec =~ s/AM//;
    }

    return timelocal($sec,$min,$hr,$dd,$mon,$yr);
}

{
    my $str1 = "2016-03-12 06:31:55";
    my $str2 = "2016-03-13 06:31:55";

    my $t1 = str2epoch($str1);
    my $t2 = str2epoch($str2);
    my $diff = $t2 - $t1;
    my $hrss = $diff/3600/24;
    my $hr_diff = int ($diff/3600);
    my $r = $diff%3600;
    #my $milli = $diff/3600/24/60/60/60;
    my $min = 0;
    my $sec = 0;
    #my $milli = 0;

    if ($r > 60) {
        $min = int($r/60);
        $sec = $r%60;
    } else {
        $sec = $r;
    }

    print "$str1 to $str2: $hr_diff hrs, $min min, $sec sec, millisecond\n";
}

输出应为:24小时。 0分,0秒但由于夏令时,它输出:23小时。 0分,0秒

1 个答案:

答案 0 :(得分:3)

我不知道为什么你声称输出应该是24小时。正如您所暗示的那样,您居住的地方在此期间切换到夏令时,因此在两个日期之间只有23个小时。输出正确。

我认为您正试图在天,小时等方面找出两个日期时间之间的差异,但您还没有意识到并非所有日子都有24小时这一事实(以及并非所有分钟都有60秒的时间阻止你在几秒钟内完成这项工作。

为此,我使用DateTime模块。

use strict;
use warnings;

use DateTime::Format::Strptime        qw( );
use DateTime::Format::Human::Duration qw( );

my $dt_format = DateTime::Format::Strptime->new(
    pattern  => '%Y-%m-%d %H:%M:%S',
    time_zone => 'local',
    on_error  => 'croak',
);

my $dur_format = DateTime::Format::Human::Duration->new();

my $dt1 = $dt_format->parse_datetime("2016-03-12 06:31:55");
my $dt2 = $dt_format->parse_datetime("2016-03-13 06:31:55");
my $dur = $dt1->delta_md($dt2);
print($dur_format->format_duration($dur), "\n");   # 1 day