1
我有一个文件,其中包含过去的时间戳,并且都是UTC。我需要将这些转换为东部时间。我已经接近了,但它在夏时制转换中混乱了。将历史时间戳从UTC转换为本地
#!/usr/bin/perl
use strict;
use warnings;
use Time::Piece;
#DST not in effect
my $utc = '2015-03-08 01:59:00.000';
my $local = utc_to_local($utc);
print "DST not in effect: utc($utc) = local($local)\n";
#DST not in effect
$utc = '2015-03-08 02:00:00.000';
$local = utc_to_local($utc);
print "DST not in effect: utc($utc) = local($local)\n";
sub utc_to_local
{
my $utc_ts = $_[0]; #this has ms on right side, we want left 19 characters
$utc_ts = substr $utc_ts, 0, 19;
my $local_tp = localtime->strptime($utc_ts, '%Y-%m-%d %H:%M:%S');
$local_tp = $local_tp + $local_tp->tzoffset();
return $local_tp->strftime('%Y-%m-%d %H:%M:%S');
}
正如你可以看到,如果我尝试3/8 3/8凌晨2点UTC凌晨1:59。UTC,它认为已经发生了变化,但凌晨2点UTC只有3/7在9 PM。远离夏令时转换,它可以正确地进行-5和-4偏移。
DST not in effect: utc(2015-03-08 01:59:00.000) = local(2015-03-07 20:59:00)
DST not in effect: utc(2015-03-08 02:00:00.000) = local(2015-03-07 22:00:00)
DST更改发生在凌晨2点东部时间,而不是UTC 2:00 a.m.临界秒数是2015-03-08 01:59:59 EST(UTC-05:00)== 2015-03-08 06:59:59 UTC其次是2015-03-08 03:00:00 EDT(UTC -04:00)== 2015-03-08 07:00:00 UTC。此外,'localtime'使用您当前所在的时区,这不一定是您*时区*的时区。 – ThisSuitIsBlackNot
@ThisSuitIsBlackNot不正确,我明白为什么它是错误的,我只是不知道如何解决它。第二部分在这里不是问题,数据全部在东部时区产生,但是为更一般的解决方案提供了一个好点。 – kchinger