Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Объект Date


Автор: fourty_fourty 20.1.2008, 19:51
Вроде и писал по учебнику! Почти что списывал! А работать все равно не хочет! Даже по самой проблеме то сказать ни чего не могу, только что ошибка есть и все! =)

Автор: SelenIT 21.1.2008, 00:24
Цитата(fourty_fourty @  20.1.2008,  19:51 Найти цитируемый пост)
Вроде и писал по учебнику! Почти что списывал! А работать все равно не хочет!

Внимательнее нужно списывать ;). Регистр имеет значение - If, в отличие от if, не является оператором. И точка с запятой после последнего выражения в цикле for не нужна.

Но вообще лучше выбросьте этот учебник - похоже, он написан еще в прошлом веке (судя по getYear, который дает двузначный год, потому-то проверка на високосность и не работает, и куче глобальных переменных - похоже, автор учебника то ли сам не знал, как работает var, то ли не смог/не удосужился это объяснить).

А сама функция явно неверна - она всегда отсчитывает время от 1 января, игнорируя текущую дату, и почему-то "пропускает" ноябрь (NumOfDay[10]). И самое главное: зачем вообще NumOfDay и т.п., когда вся прелесть объекта http://wdh.suncloud.ru/js11.htm#ref311 в том, что можно переложить всю рутинную арифметику (включая проверку високосности) на него самого?

Код

// вызываем ф-цию с параметрами - число и месяц рождения (месяц в привычном диапазоне 1-12) 
function tillBirthday(birthday,birthmonth)
{
   var today = new Date();
   // находим момент, соответствующий текущему времени в заданном дне рождения в текущем году
   // (с точностью до получаса, бОльшая точность ни к чему, поскольку нас интересуют дни)
   // получаем разность этого момента и текущего (в миллисекундах), делим на кол-во миллисекунд в сутках и округляем
   // если результат <0 - значит, день рождения в этом году уже был, берем следующий год и повторяем расчет
   // больше 2-х раз цикл не отработает
   var daysLeft = -1;
   for (var i=0; daysLeft<0; i++) {
      var birthdate = new Date(today.getFullYear()+i,birthmonth-1,birthday,today.getHours(),30,0);
      daysLeft = Math.round((birthdate-today)/86400000);
   }
   alert('Till Your Birthday: ' + daysLeft + ' days');
}

Код

<input type="button" name="date" value="Birthday" onclick="tillBirthday(20,12);">

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)