此示例采用基准日期并添加 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
2013 年 3 月 4 日星期一上午 07:30 0 天
2013 年 3 月 5 日,星期二 1 天 07:30
2013 年 3 月 6 日星期三上午 07:30 两天
2013 年 3 月 7 日星期四 3 天 07:30 AM
2013 年 3 月 8 日,星期五,4 天 07:30
2013 年 3 月 9 日星期六 07:30 AM 5 天
2013 年 3 月 10 日星期日 6 天 08:30 # 为什么是 8:30 而不是 7:30?
7 天 2013 年 3 月 11 日星期一上午 07:30
8 天 2013 年 3 月 12 日,星期二 07:30 AM
2013 年 3 月 13 日,星期三 9 天 07:30
2013 年 3 月 14 日星期四上午 10 点 07:30
2013 年 3 月 15 日星期五 11 天 07:30
2013 年 3 月 16 日星期六 12 天 07:30
2013 年 3 月 17 日星期日 13 天 07:30
14 天 2013 年 3 月 18 日星期一上午 07:30
2013 年 3 月 19 日,星期二,15 天 07:30
16 天 2013 年 3 月 20 日,星期三 07:30 AM
17 天 2013 年 3 月 21 日星期四上午 07:30
2013 年 3 月 22 日星期五 18 天 07:30
2013 年 3 月 23 日星期六 19 天 07:30
20 天 2013 年 3 月 24 日星期日上午 07:30
最佳答案
因为夏令时从 2013 年 3 月 10 日在美国/纽约时区开始。 DateTime首先添加 $i
天(到 3 月 10 日午夜),然后增加 450 分钟到上午 8:30(因为 3 月 10 日凌晨 1:59 之后的分钟是凌晨 3:00)。参数顺序为add
没有意义;见 Adding a Duration to a Datetime .
因为它分别添加天数和分钟数(并首先处理天数),所以效果仅在 DST 实际开始或结束的日期发生。如果您想要特定时间,只需 set
它直接而不是使用 add
.或调用add
两次,一次增加分钟,然后再次增加天。
关于perl - 为什么将 6 天 7½ 小时添加到午夜会导致 8 :30?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15218648/