21.07.2016, 11:52
|
Новичок на форуме
|
|
Регистрация: 21.07.2016
Сообщений: 5
|
|
Не получается доработать скрипт калькулятора последнего дня отпуска
Есть такой скрипт:
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);
Сначала пользователь вводит начальную дату отпуска, затем вводит количество дней отпуска, скрипт выдает конечную дату отпуска. Этот скрипт можно было бы считать готовым, но в гос.учреждениях красные (праздничные) календарные дни из периода отпуска выбрасываются (т.е. праздничные дни считаются выходными, а период отпуска увеличивается на это количество дней), вот в этом то и вся проблема. Не могу придумать как выделить отпускной диапазон дат и учесть в скрипте красные календарные дни, чтобы если какое-то количество красных календарных дней попало в отпускной период, то количество (введенных пользователем) дней отпуска должно автоматически увеличится на количество красных календарных дней перед выводом конечной даты.
Буду очень признателен помощи.
|
|
21.07.2016, 13:08
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Праздничные дни устанавливаются правительством и публикуются. Поместите это дни в объект и при расчете проверяйте попадает ли какой либо из них в период отпуска.
|
|
21.07.2016, 13:53
|
Новичок на форуме
|
|
Регистрация: 21.07.2016
Сообщений: 5
|
|
1. Если я правильно понял, это надо создать new Object с массивом этих дней, или же надо на каждый красный день календаря сделать new Date?
2. Как мне выявить период отпуска, если в скрипте отпуск именно не период, просто указывается начальная дата, указывается число от 1 до 52, скрипт делает сложение этого числа с текущей датой и выдает дату, которая наступит через это количество дней.
Последний раз редактировалось insider999, 21.07.2016 в 14:03.
|
|
21.07.2016, 14:05
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
var holidays = {
"0" : [1, 2, 3...], //праздники в январе
//и т.д.
}
Пользователь указывает не число, а число календаря, а значит можно узнать календарный период (чистый) - от указанного дня указанного месяца до N дня следующего (или ткущего месяца). Эти расчеты не сложно сделать, а если номер месяца есть в объекте holidays, значит проверить есть ли праздники в этом месяце попадающие на период отпуска. И если есть, то суммировать каждое совпадение.
|
|
22.07.2016, 13:18
|
Новичок на форуме
|
|
Регистрация: 21.07.2016
Сообщений: 5
|
|
Как только ни пытался выявить период, никак не получается. А потом перечитал еще раз Ваше сообщение и понял что Вы имеете ввиду, что число от 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() не пашет.
|
|
22.07.2016, 13:29
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,116
|
|
insider999,
|
|
22.07.2016, 13:53
|
Новичок на форуме
|
|
Регистрация: 21.07.2016
Сообщений: 5
|
|
Сообщение от рони
|
insider999,
|
рони, что это значит, по-русски скажите. Вот примерный скрипт, только с чем сравнивать holidays[i] и holidays[i][j] вот в чем вопрос
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, 22.07.2016 в 14:03.
|
|
22.07.2016, 14:16
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
insider999, не в каждом месяце праздники. Пользователь указывает сразу дату и месяц, начало отпуска. Узнав по указанной продолжительности месяц окончания отпуска, проверяем есть ли в объекте holidays эти месяцы, и только если есть проверяем. Может оказаться что и проверять то не надо.
Причем можно ведь проверять получая дату, а можно, зная номер месяца и количество дней в нем, стартовый и конечный дни, проверять только их соответствия.
|
|
22.07.2016, 14:30
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,116
|
|
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());
|
|
22.07.2016, 14:42
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
рони,
а год в праздниках зачем?
|
|
|
|