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.5 時間を追加すると、結果には余分な時間が含まれます。

オリジナル 2013 年 3 月 4 日 月曜日 午前 12:00
0 日 2013 年 3 月 4 日月曜日の午前 7 時 30 分
2013 年 3 月 5 日(火)午前 7 時 30 分 1 日
2013 年 3 月 6 日 (水) 午前 7 時 30 分 2 日
2013 年 3 月 7 日(木)午前 7 時 30 分 3 日
2013 年 3 月 8 日(金)午前 7 時 30 分 4 日
2013 年 3 月 9 日(土)午前 7 時 30 分 5 日
6 日 2013 年 3 月 10 日 (日) 午前 8 時 30 分 # なぜ 7 時 30 分ではなく 8 時 30 分なのか?
2013 年 3 月 11 日月曜日の午前 7 時 30 分 7 日
8 日 2013 年 3 月 12 日火曜日 07:30 AM
2013 年 3 月 13 日水曜日 午前 7 時 30 分 9 日
2013 年 3 月 14 日(木)午前 7 時 30 分 10 日
2013 年 3 月 15 日 (金) 午前 7 時 30 分 11 日
2013 年 3 月 16 日(土)午前 7 時 30 分 12 日
2013 年 3 月 17 日(日)午前 7 時 30 分 13 日
2013 年 3 月 18 日月曜日の午前 7 時 30 分 14 日間
2013 年 3 月 19 日火曜日 07:30 AM の 15 日間
2013 年 3 月 20 日水曜日 午前 7 時 30 分 16 日
2013 年 3 月 21 日 木曜日 午前 7 時 30 分 17 日
2013 年 3 月 22 日金曜日の午前 7 時 30 分 18 日
2013 年 3 月 23 日(土)午前 7 時 30 分 19 日
2013 年 3 月 24 日(日)午前 7 時 30 分 20 日
4

1 に答える 1

19

America/New_York タイムゾーンでは 2013 年 3 月 10 日にサマータイムが始まるためです。 DateTimeは、最初に$i日数を追加して (3 月 10 日の午前 0 時を取得するため)、次に 450 分を追加して午前 8 時 30 分を取得します (3 月 10 日の午前 1 時 59 分以降は午前 3 時であるため)。パラメータの順序にaddは意味がありません。Datetime への期間の追加を参照してください。

日と分を別々に追加する (そして最初に日を処理する) ため、効果は DST が実際に開始または終了する日付にのみ発生します。特定の時間が必要な場合はset、を使用する代わりに直接指定してaddください。addまたは、分を追加するために 1 回、さらに日数を追加するために 2 回呼び出します。

于 2013-03-05T08:13:03.527 に答える