15.01.2016, 23:12
|
Новичок на форуме
|
|
Регистрация: 15.01.2016
Сообщений: 4
|
|
Количество отмеченный дней недели между двумя датами
Делаю курсач и попал в тупик. не знаю с какой стороны подойти и как сделать.
есть 7 чекбоксов с днями неделями. юзер отмечает нужные.
есть накопительная sum.
а также две даты: сегодня и статическая когда-то.
нужно посчитать, сколько раз отмеченные дни недели встречаются между этими датами. т.е. отметил, например, вт, ср и сб, запустил функцию и она в sum накапливает, сколько раз эти дни встретились на промежутке между двумя датами.
сделал только шаблон цикла, который считает только воскресенья.
не знаю как сделать взаимодействие с чекбоксами и, соответственно, впилить в цикл
<input type="checkbox" id="dOW" name="mon" value="1">ПН<br>
<input type="checkbox" id="dOW" name="tue" value="2">ВТ<br>
<input type="checkbox" id="dOW" name="wed" value="3">СР<br>
<input type="checkbox" id="dOW" name="thu" value="4">ЧТ<br>
<input type="checkbox" id="dOW" name="fri" value="5">ПТ<br>
<input type="checkbox" id="dOW" name="sat" value="6">СБ<br>
<input type="checkbox" id="dOW" name="sun" value="0">ВС<br>
<input type="button" name="save" id="save" value="GO" onclick=go()><br>
var today = new Date();
var futureDay = new Date(2016, 1, 21);
var oneDay=1000*3600*24;
var sum=0;
var test =today;
var days = (futureDay - today)/oneDay;
function go(){
sum=0;
for (i=0; i<days; i++) {
test.setDate(test.getDate()+1);
if (test.getDay()==0){
sum+=1
};
};
alert(sum);
}
|
|
16.01.2016, 14:23
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
freenick,
var calendar = [];
var stDate = "2016,0,6".split(','); //стартовая; месяц от 0-11;
var next = +stDate[2];
var dat = new Date(stDate[0],stDate[1],next);
var end_dat = +new Date(2016,1,22); //конечная;
var st = + dat;
var countDay = 0;
while(end_dat- +(dat= new Date(stDate[0],stDate[1],next)) >= 0) {
next++;
calendar[countDay++] = [dat.getDate(), dat.getMonth()+1, dat.getDay()];
}
//Третий элемент в подмассивах - день недели (0 - воскресенье)
alert([countDay, JSON.stringify(calendar)]);
Последний раз редактировалось Deff, 16.01.2016 в 14:26.
|
|
17.01.2016, 18:22
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
freenick,
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
</head>
<body>
<input type="checkbox" class="day" value="1">ПН<br>
<input type="checkbox" class="day" value="2">ВТ<br>
<input type="checkbox" class="day" value="3">СР<br>
<input type="checkbox" class="day" value="4">ЧТ<br>
<input type="checkbox" class="day" value="5">ПТ<br>
<input type="checkbox" class="day" value="6">СБ<br>
<input type="checkbox" class="day" value="0">ВС<br>
<input type="button" name="save" id="save" value="GO" ><br>
<script>
window.addEventListener('DOMContentLoaded', function() {
var save = document.querySelector('#save');
save.addEventListener('click', function() {
var days = document.querySelectorAll('.day:checked'),
sum = 0,
arr = [].map.call( days, function(sel) {
return +sel.value
});
var today = new Date();
var futureDay = new Date(2016, 1, 16);
for (; today<futureDay; ) {
if (!!~arr.indexOf(today.getDay())) sum++;
today.setDate(1 + today.getDate())
}
alert(sum)
});
});
</script>
</body>
</html>
|
|
18.01.2016, 16:42
|
Новичок на форуме
|
|
Регистрация: 15.01.2016
Сообщений: 4
|
|
рони,
я вот смотрю на твой код..и он кажется таким простым и гениальным.
если б не одно но: я половину не понимаю)
особенно вот эти 2 момента:
arr = [].map.call( days, function(sel) {
return +sel.value
});
(!!~arr.indexOf(today.getDay()))
не мог бы объяснить, пожалуйста?
а своими силами я написал вот такой трэш:
var today = new Date();
var futureDay = new Date(2016, 1, 21);
var oneDay=1000*3600*24;
var sum=0;
var test =today;
var days = (futureDay - today)/oneDay;
function go(){
sum=0;
var mon, tue, wed, thu, fri, sat, sund;
if (checkMon.checked){
mon=1;
};
if (checkTue.checked){
tue=2;
};
if (checkWed.checked){
wed=3;
};
if (checkThu.checked){
thu=4;
};
if (checkFri.checked){
fri=5;
};
if (checkSat.checked){
sat=6;
};
if (checkSund.checked){
sund=0;
};
for (i=0; i<days; i++) {
if (test.getDay()==sund || test.getDay()==mon || test.getDay()==tue || test.getDay()==wed || test.getDay()==thu || test.getDay()==fri || test.getDay()==sat){
sum+=1
};
test.setDate(test.getDate()+1);
};
alert(sum);
}
|
|
18.01.2016, 17:13
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Сообщение от freenick
|
arr = [].map.call( days, function(sel) { return +sel.value });
|
days собрали отмеченные checkbox и преобразовали в массив значений этих элементов
получилось типа [1,0] (понедельник, воскресенье)
https://learn.javascript.ru/traversi...массивы
каждый день проверяем
Сообщение от freenick
|
(!!~arr.indexOf(today.getDay()))
|
есть ли этот день в массиве отмеченных , то есть if (arr.indexOf(today.getDay()) !== -1)
alert(!!~-1);
|
|
18.01.2016, 19:44
|
Новичок на форуме
|
|
Регистрация: 15.01.2016
Сообщений: 4
|
|
рони,
Спасибо большое!
теперь могу с этим работать)
|
|
18.01.2016, 23:20
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
По идее, по календарю(calendar) удобнее считать отмеченные , ну и можно вывести календарик (в верхней строке день недели) с галками отмеченных(там уже и число и месяц и день недели. Просто повторный прогон по массиву calendar, (хотя можно и в цикле создания календаря добавлять отметки), лень писать код, , проще советовать...
Еще симпатичнее, без чекитов, прям в календаре тыкать даты(дни недели)
Последний раз редактировалось Deff, 18.01.2016 в 23:23.
|
|
19.01.2016, 00:25
|
Новичок на форуме
|
|
Регистрация: 15.01.2016
Сообщений: 4
|
|
Deff,
у меня в качестве календаря DateTimePicker. там нельзя отмечать дни недели, а заморачиваться с этим времени уже нет.
поэтому я через плагин выбираю конечную дату, потом суммирую дни по дням недели через выше предложенную функцию.
а дальше уже творю свои грязные делишки с полученным числом
|
|
|
|