Операции сложения и вычитания для дат

Проблема

Имеется значение даты/времени. Требуется определить дату/время, отделенную от них некоторым промежутком в прошлом или будущем.

Решение

Проблема решается простым сложением или вычитанием секунд с начала эпохи:
$when = $now + $difference;
$then = $now - $difference;
Если у вас имеются отдельные компоненты полного времени, воспользуйтесь модулем Date::Calc с CPAN. Если вычисления выполняются только с целыми днями, примените функцию Add_Delta_Days (смещение $offset может представлять собой как положительное, так и отрицательное целое количество дней):
use Date::Calc qw(Add_Delta_Days);
($у2, $rn2, $d2) = Add_Delta_Days($y, $d, $offset);
Если в вычислениях используются часы, минуты и секунды (то есть не только дата, но и время), воспользуйтесь функцией Add_Delta_DHMS:
use Date::DateCalc qw(Add_Delta_DHMS);
($year2, $month2, $day2, $h2, $m2, $s2) =
Add_Delta_DHMS( $year, $month, $day, $hour, $minute, $seconds,
                $days_offset, $hour_offset, $minute_offset, $seconds_offset );

Комментарий

Вычисления с секундами от начала эпохи выполняются проще всего (если не считать усилий на преобразования даты/времени в секунды и обратно). В следующем фрагменте показано, как прибавить смещение (в данном примере — 55 дней, 2 часа, 17 минут и 5 секунд) к заданной базовой дате и времени:
$birthtime = 96176750;          # 18 января 1973 года, 03:45:50
$interval = 5 +                 # 5 секунд
17 * 60 +                       # 17 минут
2 * 60 * 60 +                   # 2 часа

55 * 60 * 60 * 24;              # и 55 дней
$then = $birthtime + $interval;
print "Then is ", scalar(localtime($then)), "\n";
Мы также могли воспользоваться функцией Add_Delta_DHMS и обойтись без преобразований к секундам с начала эпохи и обратно:
use Date::Calc qw(Add_Delta_DHMS);
($year, $month, $day, $hh, $mm, $ss) = Add_Delta_DHMS(
1973, 1, 18, 3, 45, 50,        # 18 января 1973 года, 03:45:50
55, 2, 17, 5);                 # 55 дней, 2 часа, 17 минут, 5 секунд
print "To be prcise: $hh:$mm:$ss, $month/$day/$year\n";
Как обычно, необходимо проследить, чтобы аргументы функции находились в правильных интервалах. Add_Delta_DHMS получает полное значение года (без вычитания 1900). Нумерация месяцев начинается с 1, а не с 0. Аналогичные параметры передаются и функции Add_Delta_Days модуля Date::DateCalc:
use Date::DateCalc 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";

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: