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