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, "%i:%M %p on %A, %B %e, %Y ");
    print "$i days $t1\n";
}

当添加 6 天 7½ 小时时,结果包含一个额外的小时。

2013 年 3 月 4 日星期一上午 12:00
0 天 2013 年 3 月 4 日星期一上午 07:30
1 天 2013 年 3 月 5 日星期二上午 07:30
2 天 2013 年 3 月 6 日星期三上午 07:30
3 天 2013 年 3 月 7 日星期四上午 07:30
4 天 2013 年 3 月 8 日星期五上午 07:30
5 天 2013 年 3 月 9 日星期六上午 07:30
6 天 2013 年 3 月 10 日星期日上午 8:30 # 为什么是 8:30 而不是 7:30?
7 天 2013 年 3 月 11 日星期一上午 07:30
8 天 2013 年 3 月 12 日星期二上午 07:30
9 天 2013 年 3 月 13 日星期三上午 07:30
10 天 2013 年 3 月 14 日星期四上午 07:30
11 天 2013 年 3 月 15 日星期五上午 07:30
12 天 2013 年 3 月 16 日星期六上午 07:30
13 天 2013 年 3 月 17 日星期日上午 07:30
14 天 2013 年 3 月 18 日星期一上午 07:30
15 天 2013 年 3 月 19 日星期二上午 07:30
16 天 2013 年 3 月 20 日星期三上午 07:30
17 天 2013 年 3 月 21 日星期四上午 07:30
18 天 2013 年 3 月 22 日星期五上午 07:30
19 天 2013 年 3 月 23 日星期六上午 07:30
20 天 2013 年 3 月 24 日星期日上午 07:30
4

1 回答 1

19

因为夏令时在 America/New_York 时区从 2013 年 3 月 10 日开始。 DateTime首先添加$i天数(以获取 3 月 10 日的午夜),然后添加 450 分钟以获取上午 8:30(因为 3 月 10 日上午 1:59 之后的分钟为上午 3:00)。参数的顺序add没有意义;请参阅向日期时间添加持续时间

因为它分别添加天和分钟(并首先处理天),所以效果只发生在 DST 实际开始或结束的日期。如果你想要一个特定的时间,set直接使用它而不是使用add. 或者调用add两次,一次增加分钟,然后再次增加天数。

于 2013-03-05T08:13:03.527 回答