negative remainder
Oct 02 2009Делая домашнее задание по Javascript (рукотворный календарик) столкнулся с проблемой определения дня недели для первого дня текущего месяца. Сначала всплыло то, что в буржуинском языке Sunday (воскресенье) — первый день недели, т.е. день недели с нулевым индексом. Ничего умнее того, чтобы доделать ещё один метод к классу Date, я не придумал.
Date.prototype.wDay = function ()
{
// sunday must be the last day of the week
if (this.getDay() == 0)
return 6;
return this.getDay()-1;
}
Дальше надо было получать сам первый день недели. С подозрением на то, что стандартной функции нет (да и искать было лень, хотелось поупражняться), я засел за это дело. Ковырялся-ковырялся, получилось нечто типа следующего:
Date.prototype.getFirstDay = function()
{
return (7*5+this.wDay()-this.getDate()+1)%7;
}
7*5 гарантированно больше числа дней в месяце, с учётом того, что календарь делался на третью от Солнца планету, так что мы всегда получали целое число для получения остатка от деления на 7. Только вот magick numbers не есть хорошо, как известно. Дальнейшие ковыряния с получением остатка от деления отрицательных чисел привели к неожиданным результатам.
Между делом я использовал в соседней консоли Python как калькулятор, который мне выдавал, что (4-16)%7 == 2. В то же время javascript делал нечто необъяснимое, что я сначала сбрасывал на счёт не самых естественных индексов для дней недели, всё же люди с 1 привыкли считать их. Wikipedia же говорит нам, что по-своему прав каждый, ведь -12 = 7*(-2)+2, равно как и -12 = 7*(-1)+(-5). Workaroud для такого делается следующим образом:
Date.prototype.getFirstDay = function()
{
var firstDay = (this.wDay()-this.getDate()+1)%7;
if (firstDay < 0)
{
return firstDay+7;
}
return firstDay;
}
Такая вот коварная, хоть и примитивная математика.
samsay.ru — народная медицина и кулинария
Выделенные сервера в аренду. Поставил что надо и вперёд
Спецтехника из Китая — продажа и прямые поставки. Тягачи, бульдозеры
{ Tags: calendar, javascript, math, negative remainder, prototype, weekday }




Recent Comments