Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.07.2016, 11:52
Новичок на форуме
Отправить личное сообщение для insider999 Посмотреть профиль Найти все сообщения от insider999
 
Регистрация: 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);


Сначала пользователь вводит начальную дату отпуска, затем вводит количество дней отпуска, скрипт выдает конечную дату отпуска. Этот скрипт можно было бы считать готовым, но в гос.учреждениях красные (праздничные) календарные дни из периода отпуска выбрасываются (т.е. праздничные дни считаются выходными, а период отпуска увеличивается на это количество дней), вот в этом то и вся проблема. Не могу придумать как выделить отпускной диапазон дат и учесть в скрипте красные календарные дни, чтобы если какое-то количество красных календарных дней попало в отпускной период, то количество (введенных пользователем) дней отпуска должно автоматически увеличится на количество красных календарных дней перед выводом конечной даты.

Буду очень признателен помощи.
Ответить с цитированием
  #2 (permalink)  
Старый 21.07.2016, 13:08
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Праздничные дни устанавливаются правительством и публикуются. Поместите это дни в объект и при расчете проверяйте попадает ли какой либо из них в период отпуска.
Ответить с цитированием
  #3 (permalink)  
Старый 21.07.2016, 13:53
Новичок на форуме
Отправить личное сообщение для insider999 Посмотреть профиль Найти все сообщения от insider999
 
Регистрация: 21.07.2016
Сообщений: 5

1. Если я правильно понял, это надо создать new Object с массивом этих дней, или же надо на каждый красный день календаря сделать new Date?
2. Как мне выявить период отпуска, если в скрипте отпуск именно не период, просто указывается начальная дата, указывается число от 1 до 52, скрипт делает сложение этого числа с текущей датой и выдает дату, которая наступит через это количество дней.

Последний раз редактировалось insider999, 21.07.2016 в 14:03.
Ответить с цитированием
  #4 (permalink)  
Старый 21.07.2016, 14:05
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

var holidays = {
    "0" : [1, 2, 3...], //праздники в январе
    //и т.д. 
}


Пользователь указывает не число, а число календаря, а значит можно узнать календарный период (чистый) - от указанного дня указанного месяца до N дня следующего (или ткущего месяца). Эти расчеты не сложно сделать, а если номер месяца есть в объекте holidays, значит проверить есть ли праздники в этом месяце попадающие на период отпуска. И если есть, то суммировать каждое совпадение.
Ответить с цитированием
  #5 (permalink)  
Старый 22.07.2016, 13:18
Новичок на форуме
Отправить личное сообщение для insider999 Посмотреть профиль Найти все сообщения от insider999
 
Регистрация: 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() не пашет.
Ответить с цитированием
  #6 (permalink)  
Старый 22.07.2016, 13:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

insider999,
Ответить с цитированием
  #7 (permalink)  
Старый 22.07.2016, 13:53
Новичок на форуме
Отправить личное сообщение для insider999 Посмотреть профиль Найти все сообщения от insider999
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 22.07.2016, 14:16
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

insider999, не в каждом месяце праздники. Пользователь указывает сразу дату и месяц, начало отпуска. Узнав по указанной продолжительности месяц окончания отпуска, проверяем есть ли в объекте holidays эти месяцы, и только если есть проверяем. Может оказаться что и проверять то не надо.
Причем можно ведь проверять получая дату, а можно, зная номер месяца и количество дней в нем, стартовый и конечный дни, проверять только их соответствия.
Ответить с цитированием
  #9 (permalink)  
Старый 22.07.2016, 14:30
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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());
Ответить с цитированием
  #10 (permalink)  
Старый 22.07.2016, 14:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

рони,
а год в праздниках зачем?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите! Не получается перевести скрипт на русский ! xddanik AJAX и COMET 0 17.06.2015 20:28
Помогите доработать скрипт Joannes Общие вопросы Javascript 0 08.09.2013 21:21
Не получается интегрировать скрипт с подгрузкой контента в cms zLobster Элементы интерфейса 0 20.04.2012 11:19
Скрипт калькулятора (не могу добавить еще одно значение) Jee_Day Я не знаю javascript 2 22.05.2009 13:19
Скрипт калькулятора ЕМС-почты России battrack Ваши сайты и скрипты 2 03.03.2009 20:20