首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl脚本时间差计算相差一个小时

Perl脚本时间差计算相差一个小时
EN

Stack Overflow用户
提问于 2016-03-14 07:25:31
回答 1查看 301关注 0票数 0

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

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

代码语言:javascript
运行
复制
#!/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秒

EN

回答 1

Stack Overflow用户

发布于 2016-03-14 20:13:04

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

我认为您正在尝试找出两个日期时间在天、小时等方面的差异,但您没有意识到,并非所有的一天都有24小时(也不是所有的分钟都有60秒),这阻止了您从若干秒开始这样做。

为此,我将使用DateTime模块。

代码语言:javascript
运行
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35977188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档