Blog: Alter World

Виртуальный мир является своеобразным Alter Ego мира реального…

Вычисляем номер недели

Комментариев нет 13 мая 2011, 18:38 • Практика

Для начала мне хотелось бы пояснить что подразумевается под номером недели. Ни для кого не секрет, что во всем мире одним из отрезков времени является семидневная неделя и количество этих недель в пределах года строго определенное – 52 или 53. Если считать от начала года количество прошедших недель, то мы получим некоторое число, которое как раз и будет номером недели.

Алгоритм

Алгоритм нахождения для недели оказался достаточно прост, но в нем есть одна заковырка – правильно учесть високосный это год или нет. В приведенных ниже выражениях все деления целочисленные (остаток от деления не учитывается!), под Day, Month и Year понимается, соответственно День, Месяц и Год (расчетная дата). WN — искомое значение (порядковый номер недели).
a = (14 - Month)/12
y = Year + 4800 - a
m = Month + 12a - 3
JD = Day - (153m+2)/5 + 365y + y/4 - y/100 + y/400 - 32045
d4 = (JD + 31741 - (JD mod 7)) mod 146097 mod 36524 mod 1461
L = d4/1460
d1 = ((d4 - L) mod 365) + L
WN = (d1/7) + 1

Программа

В случае PHP с использованием модулей bcmath и calendar решение для текущей даты будет выглядеть примерно так:
<?php
$JD = cal_to_jd(CAL_GREGORIAN, date("m"), date("d"), date("Y"));
$d4 = bcmod(bcmod(bcmod($JD+31741-bcmod($JD,7),146097),36524),1461);
$L = floor($d4/1460);
$d1 = bcmod($d4-$L,365) + $L;
$WN = 1+floor($d1/7);
echo "Week number: " . $WN;
?>

Код программы на PERL:
#!/usr/bin/perl
@currdate = localtime(time());
$a = int((14-$currdate[4])/12);
$y = $currdate[5]+4800-$a;
$m = $currdate[4]+12*$a-3;
$JD = $currdate[3]+int((153*$m+2)/5)+365*$y+int($y/4)-int($y/100)+int($y/400)-32045;
$d4 = mod(mod(mod($JD+31741-mod($JD,7),146097),36524),1461);
$L = int($d4/1460);
$d1 = mod($d4-$L,365)+$L;
$WN = 1+int($d1/7);
print "Week number: ".$WN;

sub mod () {
return $_[0]-int($_[0]/$_[1])*$_[1];
}

В принципе теперь этот кусок кода можно использовать для создания календаря или архива записей сайта, упорядоченный по недельным архивам.

Комментариев нет

Вы можете подписаться на комментарии к этой статье через RSS или отправить к ней TrackBack.

Оставить свое мнение

XHTML: Вы можете использовать эти тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>