我正在尝试使用模块中的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标志.
为什么这不正常?我错过了什么吗?
您必须明确设置时区:
除非另有说明,否则新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)
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |