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


Автор: VoDevil 29.7.2009, 17:26
Нужно подсчитать кол-во дней в заданном месяце, заданного года. В js подходящего метода похоже нет? В php есть cal_days_in_month() , но php тоже не всегда скомпилирован с поддержкой календарных функций.

Может быть кто-то из вас, коллеги, уже решал такую задачу? Важен не столько сам код, сколько принцип подсчета. Как я понимаю, подводных камней куча. Из того что сразу приходит в голову: Учесть високосные года и с каждым 100-м годом я слышал "что-то не так" ;) Календарь имеется ввиду Православный, он же русский, он же CAL_JULIAN.

p.s. Может можно из какого-нибудь jQuery вырезать?... ;)

Автор: comtat 29.7.2009, 17:58
http://www.dreamincode.net/code/snippet3348.htm

Автор: Michael.de 31.7.2009, 01:58
comtat, в твоём примере не учитывается, что: 1583 < год < 2499 (хотя насчёт правой границы я не уверен)

Цитата(VoDevil @  29.7.2009,  17:26 Найти цитируемый пост)
Учесть високосные года и с каждым 100-м годом я слышал "что-то не так" ;) 
В http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B8%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%B0%D0%BB%D0%B5%D0%BD%D0%B4%D0%B0%D1%80%D1%8C об этом говорится следующее:
"Год високосен, то есть содержит 366 дней, если:
1. его номер без остатка делится на 4 и не делится на 100 или 
2. его номер делится без остатка на 400.
smile

VoDevil, попробуй следующий код:
Код

<html>
<head>
<script type='text/javascript'>
function leap(y){
 var r=0;
 if (y%4==0&&y%100!=0||y%400==0) r++;
 return r;
}

function showDays(month, year){
 var ret, days;
 days=[31, 28+leap(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
 if (isNaN(month) || month<1 || month>12 || month!=parseInt(month) || isNaN(year) || year<1583 || year>2499 || year!=parseInt(year)) ret='Wrong Date';
 else ret=days[month-1];
 alert(ret); // <-- Just test
 return ret;
}
</script>
</head>
<!-- Just test: -->
<body onload='showDays(2, 1900);'>
</body>
</html>

Автор: VoDevil 31.7.2009, 14:19
А что думаете вот о таком методе, господа - http://snowcore.net/javascript-%D1%83%D0%B7%D0%BD%D0%B0%D1%82%D1%8C-%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE-%D0%B4%D0%BD%D0%B5%D0%B9-%D0%B2-%D0%BC%D0%B5%D1%81%D1%8F%D1%86%D0%B5 ? Индийский?

Автор: Avb 4.8.2009, 11:29
Код

function getMonthDays(m, y){
// m - месяц, y - год
//считаем, что месяц мы будем передавать в привычной для нас форме (от 1 до 12)
//учитывая, что объект Date ожидает значения от 0 до 11, отнимаем единицу от m 

m--;

// создаем объект Date с датой на 1-е число нашего месяца
var d = new Date(m+"/01/"+y+" 12:00")

//увеличиваем месяц на единицу, получая таким образом объект Date на 1-е число следующего месяца
d.setMonth(m+1);

//от полученной даты отнимаем одни сутки (86400000 миллисекунд)
//получаем Date на последний день нашего месяца m
d = new Date(d.getTime()-86400000);

//возвращаем день месяца
return  d.getDate();

}

Автор: VoDevil 7.8.2009, 08:47
Всеже остановился вот на таком варианте:
Код

var daysInMonth = function(_month, _year){
  _month--;
  return 32 - new Date(_year, _month, 32).getDate();
}

С первого взгляда он должен быть наимение ресурсоемким. Если разбираться во внутреннем механизме объекта Date то может это конечно и не правильно.

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