【问题标题】:Why does adding 6 days 7½ hours to midnight result in 8:30?为什么在午夜加上 6 天 7½ 小时会得到 8:30?
【发布时间】:2013-03-05 08:04:59
【问题描述】:

此示例采用基准日期并添加 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 日星期日上午 7:30

【问题讨论】:

  • 夏令时?
  • 如果您想忽略 DST 更改,请将时区切换为 floating

标签: perl datetime


【解决方案1】:

因为夏令时在 America/New_York 时区从 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 两次,一次添加分钟,然后再次添加天数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多