我正在尝试使用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标志。
为什么这不正常?我错过了什么吗?
答案 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