Perl 脚本时差计算偏差一小时



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

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

#!/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, millisecondn";
}

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

我不知道

你为什么声称输出应该是 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

最新更新