Количество отмеченный дней недели между двумя датами
Делаю курсач и попал в тупик. не знаю с какой стороны подойти и как сделать.
есть 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); } |
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)]); |
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> |
рони,
я вот смотрю на твой код..и он кажется таким простым и гениальным. если б не одно но: я половину не понимаю) особенно вот эти 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); } |
Цитата:
получилось типа [1,0] (понедельник, воскресенье) https://learn.javascript.ru/traversi...массивы каждый день проверяем Цитата:
alert(!!~-1); |
рони,
Спасибо большое! теперь могу с этим работать) |
По идее, по календарю(calendar) удобнее считать отмеченные , ну и можно вывести календарик (в верхней строке день недели) с галками отмеченных(там уже и число и месяц и день недели. Просто повторный прогон по массиву calendar, (хотя можно и в цикле создания календаря добавлять отметки), лень писать код, :) , проще советовать...
Еще симпатичнее, без чекитов, прям в календаре тыкать даты(дни недели) |
Deff,
у меня в качестве календаря DateTimePicker. там нельзя отмечать дни недели, а заморачиваться с этим времени уже нет. поэтому я через плагин выбираю конечную дату, потом суммирую дни по дням недели через выше предложенную функцию. а дальше уже творю свои грязные делишки с полученным числом |
Часовой пояс GMT +3, время: 11:23. |