Я пишу программу JavaScript, которая принимает дату, набранную пользователем, и определяет, в какой день недели наступает данная дата. Я могу заставить программу принять дату. Я использовал отладочные заявления для печати значений дня, месяца, года и столетия, чтобы убедиться, что программа правильно получает значения, какими они до сих пор.Написание программы JavaScript для расчета високосного года
У меня также есть отладочная переменная, называемая totalNumDays
, которая хранит количество дней за каждый месяц, так как это значение отличается. (Январь имеет 31 день, апрель - 30 дней, февраль - 28 или 29 дней). Проблема, с которой я сталкиваюсь, заключается в том, чтобы число было правильным в течение месяца февраля.
То, что я сделал, было создать массив всех месяцев с 31 дней:
//1 = January, 3 = March, 5 = May,..., etc.
var monthNumsWith31 = [1, 3, 5, 7, 8, 10, 12];
Тогда позже я использую цикл для перебора, чтобы определить количество дней. Я попробовал пару разных вещей. Один я думал, что имело смысл был:
for(var i = 0; i < monthNumsWith31.length; i++)
{
if(month == monthNumsWith31[i])
{
totalNumDays = 31;
}
else
{
if(month == 2 && isLeapYear() == true)
{
totalNumDays = 29;
}
else if(month == 2 && isLeapYear() == false)
{
totalNumDays = 28;
}
else
{
totalNumDays = 30;
}
}
Я попытался целую кучу разных вещей и не могу показаться, чтобы получить его, чтобы сохранить правильное количество дней, в течение февраля. Я даже попытался создать второй массив из monthNumsWith30
и использовать два разных цикла для итерации через оба из них и установить соответствующее количество дней в течение нескольких месяцев с 30 и 31 днями. Я думаю, проблема может быть в моей функции isLeapYear()
. Вот код для isLeapYear()
. Обратите внимание, что year
является глобальным, поэтому функция имеет к нему доступ.
function isLeapYear() {
if(year % 4 == 0)
{
if(year % 100 == 0)
{
if(year % 400 == 0)
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
else
{
return false;
}
}
Я попытался следовать формуле, чтобы определить, является ли год високосным годом или нет. Формула может быть представлена здесь: https://gyazo.com/9e4b7fb92014d1e27315807c188fd5e0
Кто-нибудь знает, почему моя функция не делает то, что она должна делать? Благодарю.
ОБНОВЛЕНИЕ Теперь я правильно его работаю, чтобы определить правильное количество дней для каждого месяца. Однако у меня есть еще одна проблема.
Чтобы узнать, в какой день недели наступает данная дата, я использую Конгруэнцию Целлера. Конкретной формулой, которую я использую, является ((26M - 2)/10 + D + Y + Y/4 + C/4 + 5C) MOD 7
, где M
, D
, Y
- это именно то, что они кажутся, и C
- это век (первые две цифры года). Существует часть алгоритма, который содержит
IF Month < 3 THEN
Year = Year - 1
Month = Month + 10
ELSE
Month = Month - 2
END IF
У меня все работает правильно. Я включил множество операторов отладки, чтобы убедиться, что он получает правильные значения, которые он есть, но по какой-то причине компьютер неправильно вычисляет это выражение.
Этот алгоритм даст число от 0 до 6. 0 является воскресенью, 1 является понедельником и т. Д. Например, взята дата 2/15/16. Эта дата произошла в понедельник. Понедельник, 15 Февраля 2016 г.
В моей программе у меня есть следующий код
var weekdayIndex = (Math.floor((26 * monthVal) - 2/10) + dayVal +
yearVal + Math.floor(yearVal/4) + Math.floor(centuryVal/4) +
(5 * centuryVal)) % 7;
Когда это выражение работает, оно должно быть равно 1
, но по какой-то причине она равна 0
.Я сделал математику вручную и оценивал каждое индивидуальное выражение снова и снова и продолжал получать 1
. Сделав это вручную, я получил цифры . Когда я помещаю это выражение в компьютер напрямую (без всех имен переменных и выражений Math.floor, просто числа), он правильно получает значение. Я не знаю, почему это неправильно, когда я использую имена переменных и выражения. Есть идеи?
, если ваша проблема просто вычисляя день неделю заданной даты, почему вы не используете [Date api] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay)? –
Нам сказали, что нам не разрешено использовать это. – GenericUser01