You have a date and time and want to find the date and time of some period in the future or past.
Simply add or subtract Epoch seconds:
$when = $now + $difference; $then = $now - $difference;
If you have distinct DMYHMS values, use the CPAN
Date::Calc module. If you're doing arithmetic with days only, use
Add_Delta_Days
(
$offset
is a positive or negative integral number of days):
use Date::Calc qw(Add_Delta_Days); ($y2, $m2, $d2) = Add_Delta_Days($y, $m, $d, $offset);
If you are concerned with hours, minutes, and seconds (in other words, times as well as dates), use
Add_Delta_DHMS
:
use Date::Calc qw(Add_Delta_DHMS); ($year2, $month2, $day2, $h2, $m2, $s2) = Add_Delta_DHMS( $year, $month, $day, $hour, $minute, $second, $days_offset, $hour_offset, $minute_offset, $second_offset );
Calculating with Epoch seconds is easiest, disregarding the effort to get dates and times into and out of Epoch seconds. This code shows how to calculate an offset (55 days, 2 hours, 17 minutes, and 5 seconds, in this case) from a given base date and time:
$birthtime = 96176750; # 18/Jan/1973, 3:45:50 am $interval = 5 + # 5 seconds 17 * 60 + # 17 minutes 2 * 60 * 60 + # 2 hours 55 * 60 * 60 * 24; # and 55 days $then = $birthtime + $interval; print "Then is ", scalar(localtime($then)), "\n";
Then is Wed Mar 14 06:02:55 1973
We could have used Date::Calc's
Add_Delta_DHMS
function and avoided the conversion to and from Epoch seconds:
use Date::Calc qw(Add_Delta_DHMS); ($year, $month, $day, $hh, $mm, $ss) = Add_Delta_DHMS( 1973, 1, 18, 3, 45, 50, # 18/Jan/1973, 3:45:50 am 55, 2, 17, 5); # 55 days, 2 hrs, 17 min, 5 sec print "To be precise: $hh:$mm:$ss, $month/$day/$year\n";
To be precise: 6:2:55, 3/14/1973
As usual, we need to know the range of values the function expects.
Add_Delta_DHMS
takes a full year value - that is, one that hasn't had 1900 subtracted from it. The month value for January is 1, not 0. Date::Calc's
Add_Delta_Days
function expects the same kind of values:
use Date::Calc qw(Add_Delta_Days); ($year, $month, $day) = Add_Delta_Days(1973, 1, 18, 55); print "Nat was 55 days old on: $month/$day/$year\n";
Nat was 55 days old on: 3/14/1973