Perl转换时区会产生错误的输出

时间:2015-03-24 15:57:46

标签: perl timezone timezone-offset

尝试根据this将给定时间从一个时区转换为另一个时区。 但输出是错误的。尝试了不同的价值但没有运气。 关于什么失踪的任何帮助?

use Date::Manip::DM6;
use DateTime::Format::DateManip;

my $date2 = '2015-03-24 06:00:00';
$date1 = DateTime::Format::DateManip->parse_datetime( $date2);

my $newdate= UnixDate(Date_ConvTZ($date1 , 'EST', 'PST' ),"%Y-%m-%d %T");
print "date is $date1 and newdate is $newdate";
  

E:> perl test.pl

     

日期为2015-03-24T06:00:00,newdate为2015-03-23 12:00:00

预期结果是newdate => 2015-03-24 03:00:00

3 个答案:

答案 0 :(得分:6)

two ESTs and two ASTs and two PSTs和五个CST。

AST     Arabia Standard Time                    UTC+03
AST     Atlantic Standard Time                  UTC−04

EST     Eastern Standard Time (North America)   UTC−05
EST     Eastern Standard Time (Australia)       UTC+10

PST     Pacific Standard Time (North America)   UTC−08
PST     Philippine Standard Time                UTC+08

通常,避免使用时区缩写,因为它们不明确。改为使用抵消。

当我运行没有DateTime :: Format :: DateManip的代码时,我得到了你期望的结果(我无法通过测试)。

use v5.10;
use Date::Manip::DM6;

say UnixDate(
    Date_ConvTZ("2015-03-24 06:00:00", "EST", "PST"),
    "%Y-%m-%d %T"
);
# 2015-03-24 03:00:00

但是不要在日期库上赌博,为你选择与时区缩写相同的含义,只是不要使用它们。

答案 1 :(得分:1)

为什么您没有使用DateTime' builtin来更改DateTime对象的时区?它使用Olson DB个时区名称。

答案 2 :(得分:1)

您应该参考documentation for Date-Manip's valid time zone formats。它将接受时区偏移(例如-0500),时区缩写(例如EST)或Olson时区标识符(例如America/New_York)。它还会接受-0500 (EST)

等值的组合

我没有尝试过,但我也认为它会接受带有偏移的组合Olson标识符。如果是这样,那么这将是最明确的表示。

请记住,偏移只是时区表示的一部分。许多时区为夏令时切换偏移。如果您总是使用固定偏移量或缩写,则实际上东部时区将遵循东部日光时间(EDT)时,您可能会通过EST。