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

前端之家收集整理的这篇文章主要介绍了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.或者调用添加两次,一次添加分钟,然后再添加几天.

猜你在找的Perl相关文章