Не получается доработать скрипт калькулятора последнего дня отпуска
Есть такой скрипт:
function takeEndDateOtpusk(UsDate, countDays) { var dateFromUserDate = new Date(UsDate);// Дата пользователя var timeFrom1970ToUserDate = dateFromUserDate.getTime(); var ruleCountDays = countDays - 1; var dateFrom1970ToCountDays = new Date(1000 * 60 * 60 * 24 * ruleCountDays); var millSecToCountDays = dateFrom1970ToCountDays.getTime(); var millSecItog = timeFrom1970ToUserDate + millSecToCountDays; var dateFromNowToCountDays = new Date(millSecItog); var arrayWeek = ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"]; var beginDay = arrayWeek[dateFromUserDate.getDay()];// День недели даты пользователя var endDay = arrayWeek[dateFromNowToCountDays.getDay()];// День недели конца отпуска var beginDate = dateFromUserDate.getDate();// Число даты пользователя var endDate = dateFromNowToCountDays.getDate();// Число конца отпуска var arrayMonth = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]; var beginMonth = arrayMonth[dateFromUserDate.getMonth()];// Месяц даты пользователя var endMonth = arrayMonth[dateFromNowToCountDays.getMonth()]; // Месяц конца отпуска var beginYear = dateFromUserDate.getFullYear();// Год даты пользователя var endYear = dateFromNowToCountDays.getFullYear();// Год конца отпуска var beginDateToWrite = beginDay + " " + beginDate + " " + beginMonth + " " + beginYear; document.write("Если начальная дата отпуска: <strong>" + beginDateToWrite + "</strong>, а " + "Количество дней отпуска: <strong>" + countDays + "</strong>, то последний день отпуска: <br />"); document.write("День недели: <strong>" + endDay + "</strong><br />"); document.write("Число: <strong>" + endDate + "</strong><br />"); document.write("Месяц: <strong>" + endMonth + "</strong><br />"); document.write("Год: <strong>" + endYear + "</strong><br />"); } var UserDate = prompt("Введите дату начала отпуска в формате: ГГГГ,ММ,ДД"); var UserDays = prompt("Введите число от 1 до 52"); if (UserDays <= 0) { alert("Такого количества дней не существует!"); } else if (UserDays > 52) { alert("Вы указали слишком большое количество дней!"); } else takeEndDateOtpusk(UserDate, UserDays); Сначала пользователь вводит начальную дату отпуска, затем вводит количество дней отпуска, скрипт выдает конечную дату отпуска. Этот скрипт можно было бы считать готовым, но в гос.учреждениях красные (праздничные) календарные дни из периода отпуска выбрасываются (т.е. праздничные дни считаются выходными, а период отпуска увеличивается на это количество дней), вот в этом то и вся проблема. Не могу придумать как выделить отпускной диапазон дат и учесть в скрипте красные календарные дни, чтобы если какое-то количество красных календарных дней попало в отпускной период, то количество (введенных пользователем) дней отпуска должно автоматически увеличится на количество красных календарных дней перед выводом конечной даты. Буду очень признателен помощи. |
Праздничные дни устанавливаются правительством и публикуются. Поместите это дни в объект и при расчете проверяйте попадает ли какой либо из них в период отпуска.
|
1. Если я правильно понял, это надо создать new Object с массивом этих дней, или же надо на каждый красный день календаря сделать new Date?
2. Как мне выявить период отпуска, если в скрипте отпуск именно не период, просто указывается начальная дата, указывается число от 1 до 52, скрипт делает сложение этого числа с текущей датой и выдает дату, которая наступит через это количество дней. |
var holidays = { "0" : [1, 2, 3...], //праздники в январе //и т.д. } Пользователь указывает не число, а число календаря, а значит можно узнать календарный период (чистый) - от указанного дня указанного месяца до N дня следующего (или ткущего месяца). Эти расчеты не сложно сделать, а если номер месяца есть в объекте holidays, значит проверить есть ли праздники в этом месяце попадающие на период отпуска. И если есть, то суммировать каждое совпадение. |
Как только ни пытался выявить период, никак не получается. А потом перечитал еще раз Ваше сообщение и понял что Вы имеете ввиду, что число от 1 до 52 это число календаря, но это не так, например: отпуск состоит из дат (01 июня 2016, 02 июня 2016, ..., 22 июля 2016) и если взять эти даты в массив (["01 июня 2016", "02 июня 2016", ..., "22 июля 2016"]), то пользователь вводит длину этого массива, в моем примере это как раз 52 дня начиная с 01 июня и заканчивая 22 июля. Вот если бы можно было как то из дат отпуска (между начальной и конечной датой) создать массив через цикл, а потом сравнивать с holidays, тогда действительно можно было бы найти совпадения и суммировать каждое. Кстати пробовал сделать такой цикл for(var i = 0; i < holidays.length; i++), данная строка уже не работает, проверял вставляя alert() после каждой строки, после этой alert() не пашет.
|
insider999,
:blink: |
Цитата:
var holidays = { "0" : [1, 2, 3, 4, 5, 6, 7, 8], "1" : 23, "2" : 8, "4" : [1, 9], "5" : 12, "11" : 4 }; for (var i = 0; i < holidays.length; i++) { alert(countDays); if(holidays[i] == ?) { for (var j = 0; j < holidays[i].length; j++) { if (holidays[i][j] == ?) { ruleCountDays++; } } } } |
insider999, не в каждом месяце праздники. Пользователь указывает сразу дату и месяц, начало отпуска. Узнав по указанной продолжительности месяц окончания отпуска, проверяем есть ли в объекте holidays эти месяцы, и только если есть проверяем. Может оказаться что и проверять то не надо.
Причем можно ведь проверять получая дату, а можно, зная номер месяца и количество дней в нем, стартовый и конечный дни, проверять только их соответствия. |
insider999,
var holidays = {2016 : { "0" : [1, 2, 3, 4, 5, 6, 7, 8], "1" : [23], "2" : [8], "4" : [1, 9], "5" : [12], "11" : [4] }}, UserDays = 52, dateFromUserDate = new Date("1/5/2016"); for (var i = 0; i < UserDays; i++) { var day = dateFromUserDate.getDate(); dateFromUserDate.setDate(day+1); var fullyear = dateFromUserDate.getFullYear(); var month = dateFromUserDate.getMonth(); day = dateFromUserDate.getDate(); holidays[fullyear] && holidays[fullyear][month] && holidays[fullyear][month].indexOf(day) !== -1 && --i } alert(dateFromUserDate.toLocaleDateString()); |
рони,
а год в праздниках зачем? |
Часовой пояс GMT +3, время: 02:19. |