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