由于某种原因,我用来计算两个给定日期/时间的时差的以下脚本是一小时。不确定它是否与夏令时有关。谁知道为什么?
如果可能,我想知道如何在计算中添加毫秒数。
#!/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秒
答案 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