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

tjw*_*992 3 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";
Run Code Online (Sandbox Code Playgroud)

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

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

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

输出:

2015-03-08T03:00:00
2015-03-07T03:00:00
0
0
Run Code Online (Sandbox Code Playgroud)

两个日期完全按预期打印,但出于某种原因,即使第一个日期发生在夏令时期间,第二个日期发生在夏令时之前,也没有为这两个日期设置DST标志.

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

Thi*_*Not 6

您必须明确设置时区:

除非另有说明,否则新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";
Run Code Online (Sandbox Code Playgroud)

输出:

2015-03-08T03:00:00
2015-03-07T03:00:00
1
0
Run Code Online (Sandbox Code Playgroud)

  • 当地时间使用''time_zone'=>'local'. (2认同)