This example takes a base date and adds 7½ hours, 1 day 7½ hours, 2 days 7½ hours, and so on.
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";
}
When adding 6 days 7½ hours, the result contains an extra hour.
original 12:00 AM on Monday, March 04, 2013 0 days 07:30 AM on Monday, March 04, 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
Because Daylight Saving Time begins on March 10, 2013 in the America/New_York timezone. DateTime first adds $i
days (to get midnight on March 10) and then adds 450 minutes to get 8:30 AM (because the minute after 1:59 AM on March 10 is 3:00 AM). The order of the parameters to add
is not meaningful; see Adding a Duration to a Datetime.
Because it adds days & minutes separately (and processes the days first), the effect only happens on the date when DST actually begins or ends. If you want a particular time, just set
it directly instead of using add
. Or call add
twice, once to add minutes, then again to add days.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With