Perl DateTime“is_dst()”方法无法正常工作

时间:2016-10-19 19:58:01

标签: perl datetime dst

我正在尝试使用is_dst()模块中的DateTime方法来确定是否正在进行夏令时转换。

我开始写一个非常基本的例子,我确定确实会起作用,但由于某种原因,我会得到意想不到的结果。

示例:

#!/usr/bin/perl

use strict;
use warnings;
use DateTime;

my $dt1 = DateTime->new(
    'year'  => 2015,
    'month' => 3   ,
    'day'   => 8   ,
    'hour'  => 3   ,
);

my $dt2 = DateTime->new(
    'year'  => 2015,
    'month' => 3   ,
    'day'   => 7   ,
    'hour'  => 3   ,
);

print $dt1."\n";
print $dt2."\n";
print $dt1->is_dst()."\n";
print $dt2->is_dst()."\n";
  

我开始的日期是我知道的夏令时过渡期: 2015年3月8日星期日。我之所以选择凌晨3点,是因为我知道在那个时间点已经发生了夏令时过渡。

     

然后我在夏令时过渡之前就知道了一个日期: 2015年3月7日星期六 凌晨3点

     

然后我打印两个日期及其相应的DST标志。

输出:

2015-03-08T03:00:00
2015-03-07T03:00:00
0
0

两个日期的打印完全符合预期,但由于某些原因,即使第一个日期发生在夏令时期间,第二个日期发生在夏令时之前,也没有为这两个日期设置DST标志。

为什么这不正常?我错过了什么吗?

1 个答案:

答案 0 :(得分:6)

您必须explicitly set the time zone

  

除非另有说明,否则新DateTime对象的默认时区是"浮动"时区...浮动日期时间是指未锚定到任何特定时区的日期时间。

例如:

use strict;
use warnings;
use DateTime;

my $dt1 = DateTime->new(
    'year'      => 2015,
    'month'     => 3,
    'day'       => 8,
    'hour'      => 3,
    'time_zone' => 'America/New_York'
);

my $dt2 = DateTime->new(
    'year'      => 2015,
    'month'     => 3,
    'day'       => 7,
    'hour'      => 3,
    'time_zone' => 'America/New_York'
);

print $dt1."\n";
print $dt2."\n";
print $dt1->is_dst()."\n";
print $dt2->is_dst()."\n";

输出:

2015-03-08T03:00:00
2015-03-07T03:00:00
1
0