perl – 为什么在8:30增加6天半小时到午夜?

此示例采用基准日期并添加7½小时,1天7½小时,2天7½小时等等.
use Date::Manip;
use DateTime;
use DateTime::Format::DateManip;

Date::Manip::Date_Init("TZ=America/New_York","Language=English");

my $otime = DateTime->new(
    year      => 2013,month     => 3,day       => 4,hour      => 0,minute    => 0,second    => 0,time_zone => 'America/New_York',);

my $t1 = UnixDate($otime,"%i:%M %p on %A,%B %e,%Y ");
print "original $t1\n";

for (my $i = 0; $i <= 20; $i++) {               
    my $dtw = $otime->clone();
    $dtw->add(
        minutes => (15) * 30,days    => ($i),); 
    $t1 = UnixDate($dtw,%Y ");
    print "$i days $t1\n";
}

添加6天7½小时时,结果包含额外的小时.

original 12:00 AM on Monday,march 04,2013
0 days 07:30 AM on Monday,2013
1 days 07:30 AM on Tuesday,march 05,2013
2 days 07:30 AM on Wednesday,march 06,2013
3 days 07:30 AM on Thursday,march 07,2013
4 days 07:30 AM on Friday,march 08,2013
5 days 07:30 AM on Saturday,march 09,2013
6 days 08:30 AM on Sunday,march 10,2013    # why 8:30 and not 7:30?
7 days 07:30 AM on Monday,march 11,2013
8 days 07:30 AM on Tuesday,march 12,2013
9 days 07:30 AM on Wednesday,march 13,2013
10 days 07:30 AM on Thursday,march 14,2013
11 days 07:30 AM on Friday,march 15,2013
12 days 07:30 AM on Saturday,march 16,2013
13 days 07:30 AM on Sunday,march 17,2013
14 days 07:30 AM on Monday,march 18,2013
15 days 07:30 AM on Tuesday,march 19,2013
16 days 07:30 AM on Wednesday,march 20,2013
17 days 07:30 AM on Thursday,march 21,2013
18 days 07:30 AM on Friday,march 22,2013
19 days 07:30 AM on Saturday,march 23,2013
20 days 07:30 AM on Sunday,march 24,2013

解决方法

因为夏令时开始于2013年3月10日在America / New_York时区. DateTime首先增加$i天(3月10日午夜)然后增加450分钟到达8:30 AM(因为3月10日凌晨1点59分之前的分钟是凌晨3点).要添加的参数顺序没有意义;见 Adding a Duration to a Datetime.

因为它增加了几天和几天分开处理(并处理第一天),效果仅发生在DST实际开始或结束的日期.如果你想要一个特定的时间,只需直接设置它而不是使用add.或者调用添加两次,一次添加分钟,然后再添加几天.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...