How to correctly add a duration to not have it result in invalid date?

[email protected] (Bill Moseley)
Newsgroups perl.datetime
Message-ID <CAKhN_m5M1HBuVymrZX6f6rAWQa2wpX_iR7phr=ZpJW024vkfNQ@mail.gmail.com>
Last night abou 2:15am we had some automated tests fail with this error:

Invalid local time for date in time zone: America/Los_Angeles


The problem was that (for some reason) we had a duration object of ( years
=> 7, days => 1 ) which we added to DateTime->now which ended up March 8,
2020 which is a DST change -- and 2:15am does not exist in that time zone
on that date.

If $dt and $duration can be anything, what's the best way to prevent adding
a $duration to a $dt and having it land on a non-existent date?

I realize that durations are a bit ambiguous, but is it reasonable to write
something like

     $expires_time = $start_time->clone->add( days => $expire_days );  # or
even ( years => 7, days => 1 ) like above

and not have it throw an exception?   I suspect most of us expect (and
hope) that $expires_days in the future will exist.   Or should we always
write:

$dt->add( hours => $expires_days * 24 );


What would happen if duration calculations were always done in UTC?

$tz = $dt->time_zone;
$dt->set_time_zone( 'UTC' );
$dt += $duration;
$dt->set_time_zone( $tz );



 What advice should I give to our developers about adding durations safely?
   It's a common operaton in our apps.

Thanks,

-- 
Bill Moseley
[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.