Создание калькулятора даты, который добавляет дни к дате - PullRequest
0 голосов
/ 17 января 2019

У меня есть: Дата 0 = дата начала Дата 1 = дата результата (после добавления количества дней) NDays = количество дней, которые будут добавлены

Мне нужно (js) сделать: Date0 + NDays = Date1 Помогите мне, пожалуйста, у меня есть 0,1 знания кода!

<!DOCTYPE html>
<html>
 <head>
    <script type="text/javascript">

    </script>
</head>
<body>
    <div id="reserve_form">

    <div id="pickup_date"><p><label class="form">Date 0 :</label><input type="text date" value="10/15/1555" class="textbox" id="pick_date" name="pickup_date" onchange="cal()"</p></div>

    <div id="dropoff_date"><p><label class="form">Date 1 :</label><input type="date" class="textbox" id="drop_date" name="dropoff_date" onchange="cal()"/></p></div>

    <div id="numdays"><label class="form"> NDays :</label><input type="text" class="textbox" id="numdays2" name="numdays"/></div>

    </div>
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Бенджамин рекомендовал Moment, абсолютно потрясающую библиотеку для манипулирования датами и временем. Тем не менее, манипулирование DOM не распространяется на Момент. Вам необходимо запросить DOM, прослушать события и обновить DOM в ответ на них.

Если мы разберем задачу под рукой, нам нужно

  • рендерит три поля, в простейшем случае три входа,
  • во входных данных, которые представляют дату начала и дополнительные данные для добавления, нам нужно установить прослушивателей событий , которые будут прослушивать "изменения" событий и собирать значения этих двух полей для вычисления даты окончания
  • для третьего ввода, который должен показывать дату окончания, нам нужно менять его значение так часто, как меняются первые два ввода и действительно может быть вычислена дата окончания.

Мы можем думать о HTML-части как о трех входах:

<input id="start" type="date">
<input id="inc" type="number">
<input id="result" type="date">

Самое простое решение выглядит так:

window.addEventListener('DOMContentLoaded', () => {
  const start = document.getElementById('start');
  const inc = document.getElementById('inc');
  const result = document.getElementById('result');

  const updateEndDate = () => {
    const startDate = new Date(start.value);
    const addDays = Number(inc.value);

    if (!isNaN(startDate) && !isNaN(addDays)) {
      const days = startDate.getDate(); // <- returns the day component of the date (as opposed to weekday)
      const endDate = new Date(startDate);

      endDate.setDate(days + addDays);
      result.value = endDate;
    }
  };

  start.addEventListener('change', updateEndDate);
  inc.addEventListener('change', updateEndDate);
});

Вы можете посмотреть, как этот код работает на Codepen , и вы можете его разветвлять, изменять, играть с ним сколько угодно. Давайте немного пройдемся по коду.

Во-первых, каждый элемент DOM может запускать событий DOM . Мы можем написать код, который прослушивает эти события и запускает прослушиватели событий - функции, которые мы определяем и контролируем. Таким образом, мы добавляем два прослушивателя событий: одно в start поле ввода, которое содержит дату начала в формате даты (потому что тип этого поля - «дата»), и одно в inc поле ввода, которое представляет дополнительные дни, которые будут добавлены .

Затем мы объявляем функцию, которая будет выполняться каждый раз при возникновении события «change» в поле ввода start или inc. Мы называем эту функцию updateEndDate, потому что это ее цель. Конечно, вы можете назвать это по-другому.

Наконец, внутри функции updateEndDate мы делаем три вещи: получаем значения полей start и inc и превращаем их в дату и число соответственно; мы проверяем, действительно ли это допустимые значения; и мы вычисляем новую (конечную) дату.

Часть, которая может быть наиболее запутанной, вот эта:

const days = startDate.getDate();
const endDate = new Date(startDate);

endDate.setDate(days + addDays);

Таким образом, метод Date#getDate возвращает компонент даты «день». Если дата «10 октября 2000 года», то этот метод вернет 10. Если это «17 января 1990 года», возвращаемое значение будет 17.

Затем мы создаем новый экземпляр объекта Date, endDate, который идентичен startDate. Это не обязательно важно в этом случае, но обычно рекомендуется работать с датой таким образом, потому что даты в Javascript изменяемые . Вызов методов, особенно тех, которые называются «set-что-то», изменит значение экземпляра, и часто вы можете этого не хотеть.

Итак, да, endDate. Последнее, что мы делаем, мы называем Date#setDate. Представьте, что дата начала 17 января 2019 года, и вы хотите добавить 50 дополнительных дней. Если мы просто добавим 50 к 17, дата окончания будет 67 января 2019 года, верно? Что ж, это одна вещь, которую Javascript делает для нас: как только дата обновляется (для нее вызывается «что-то множество»), она пересчитывается таким образом, который имеет смысл. Так что вместо этого будет 8 марта.

Я действительно надеюсь, что этот ответ поможет вам понять, что там происходит, и я желаю вам удачи в изучении Javascript. Так что, да, зацените codepen и желаем вам удачи!

0 голосов
/ 18 января 2019

Подробности JavaScript прокомментированы в демоверсии

/* 
Reference the form bind the change event to it. It will call
function calc() when change event triggers...
*/
document.forms[0].onchange = calc;

function calc(e) {
  // Collect all references to this form
  var ui = this.elements;
  
  // Get the values from both inputs as numbers
  var begin = ui.init.valueAsNumber;
  var cease = ui.term.valueAsNumber;

  // Convert them into milliseconds then subtract begin from cease
  var diff = (new Date(cease)) - (new Date(begin));
  
  /*
  The value of the output is...
  if diff is NaN then output is 0...
  else if diff is less than 0 then output is 0...
  else divide diff by 8.64x10⁷ (total ms in a day)
  */
  ui.days.value = isNaN(diff) ? 0 : diff < 0 ? 0 : diff / (1000 * 60 * 60 * 24);

}
<!DOCTYPE html>
<html>

<head>

</head>

<body>
  <form id="form" onsubmit='return false'>

    <label>Date 0: </label><input id="init" name="init" type="date"><br><br>
    <label>Date 1: </label><input id="term" name="term" type="date"><br><br>

    <label>Days: </label><output id="days" name="days">0</output>

  </form>
</body>

</html>
0 голосов
/ 18 января 2019

Посмотрите на https://momentjs.com. Включите библиотеку моментов, добавив следующий тег сценария непосредственно перед тегом </body>.

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...