Определение номера недели или дня недели/месяца/года
Проблема
Имеется дата в секундах с начала эпохи или в виде отдельных компонентов — года, месяца и т. д.
Требуется узнать, на какой номер педели или день недели/месяца/года она приходится.
Решение
Если дата выражена в секундах с начала эпохи, день года, день месяца или недели возвращается функцией
localtime. Номер недели легко рассчитывается по дню года.
($MOUNTHDAY, $WEEKDAY, $YEARDAY) = (localtime $DATE) [3, 6, 7];
$WEEKNUM = int($YEARDAY / 7)+1;
Отдельные компоненты полного времени можно преобразовать в число секунд с начала эпохи
и воспользоваться приведенным выше решением. Возможен н другой вариант — применение функций
Day_of_Week, Week_Number и Dау_оr_Уеаr модуля Date::Calcc CPAN:
use Date::Calc qw(Day_of_Week Week_Number Day_of_Year);
# Исходные величины - $year, $month и $day
# По определению $day является днем месяца
$wday = Day_of_Week($year, $month, $day);
$wnum = Week_Number($year, $month, $day);
$dnum = Day_of_Year($year, $month, $day);
Комментарий
Функции Day_of_Week, Week_Number и Day_of_Year получают год без вычитания 1900 и месяц в нумерации,
начинающейся с 1 (январь), а не с 0. Возвращаемое значение функции Day_of_Week находится в интервале 1-7
(с понедельника до воскресенья) или равняется 0 в случае ошибки (например, при неверно заданной дате).
use Date::Calc qw(Day_of_Week Week_Number);
$year = 1981;
$month =6; # (Июнь)
$day = 16:
@days = qw: Error Monday Tuesday Wednesday Thursday Friday Saturday Sunday:;
$wday = Day_of_Week($year, $month, $day);
print "$month/$day/$year was a $days[$wday]\n":
$wnum = Week_Number($year, $month, $day);
print "in the $wnum week.\n";
В некоторых странах существуют специальные стандарты, касающиеся первой недели года. Например, в
Норвегии первая неделя должна содержать не менее 4 дней (и начинаться с понедельника). Если 1 января
выпадает на неделю из 3 и менее дней, она считается 52 пли 53 неделей предыдущего года. В Америке
первая рабочая неделя обычно начинается с первого понедельника года. Возможно, при таких правилах
вам придется написать собственный алгоритм или по крайней мере изучить форматы
%G, %L, %W и %U функции UnixDate модуля Date::Manip.
См. такжеОписание функции localtime
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|