Определение номера недели или дня недели/месяца/года

Проблема

Имеется дата в секундах с начала эпохи или в виде отдельных компонентов — года, месяца и т. д. Требуется узнать, на какой номер педели или день недели/месяца/года она приходится.

Решение

Если дата выражена в секундах с начала эпохи, день года, день месяца или недели возвращается функцией 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



2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




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