ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
3.4. Adding to or Subtracting from a DateProblemYou have a date and time and want to find the date and time of some period in the future or past. SolutionSimply 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 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 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 ); DiscussionCalculating 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";
We could have used Date::Calc's 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";
As usual, we need to know the range of values the function expects. 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";
|