PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 105
$bree = 361535725, # 04 35 25 16 июня 1981 года $nat = 96201950, # 03 45 50 18 января 1973 года
$difference = $bree - $nat,
print There were Sdifference seconds between Nat and Bree\n ,
There were 266802575 seconds between Nat and Bree
Sseconds = Sdifference % 60,
Sdifference = (Sdifference - Sseconds) / 60
Sminutes = Sdifference % 60,
Sdifference = (Sdifference - Sminutes) / 60,
Shours = Sdifference $ 24,
Sdifference = (Sdifference - Shours) / 24,
Sdays = Sdifference % 7,
$weeks = (Sdifference - Sdays) / 7,
print (Sweeks weeks, Sdays days, Shours Sminutes $seconds)\n , (441 weeks, 0 days, 23: 49: 35)
Функции модуля Date::Calc упрощают подобные вычисления. Delta_Days возвращает количество дней между двумя датами. Даты передаются ей в виде списка «год/месяц/деиь» в хронологическом порядке, то есть начиная с более ранней.
> Смотри также---------------------------------------------------------------------------------------------
Документация по стандартному модулю Date::Calc с CPAN.
3.6. Определение номера недели или дня недели/месяца/года
Проблема
Имеется дата в секундах с начала эпохи или в виде отдельных компонентов — года, месяца и т. д. Требуется узнать, на какой номер недели или день недели/месяца/года она приходится.
Решение
Если дата выражена в секундах с начала эпохи, день года, день месяца или недели возвращается функцией localtime. Номер недели легко рассчитывается по дню года.
3.6. Определение номера недели или дня недели/месяца/года 103
(SMONTHDAY, $WEEKDAY, $YEARDAY) = (localtime $DATE) [3,6,7], $WEEKNUM = mt($YEARDAY / 7) + 1,
Отдельные компоненты полного времени можно преобразовать в число секунд с начала эпохи (см. рецепт 3.3) и воспользоваться приведенным выше решением. Возможен и другой вариант — применение функций Day_of_Week, Week_Number и Day_of_Year модуля Date::Calc с CPAN:
use Date Calc qw(Day_of_Week Week_Number Day_of_Year),
# Исходные величины - $year, Smonth и $day