Дата проверки JS - в течение 6 месяцев с сегодняшнего дня - PullRequest
0 голосов
/ 22 мая 2018

Я использую Bootstrap Datepicker и, исходя из выбора даты, мне нужно отобразить сообщение для пользователя.

Я никогда раньше не использовал Конструктор даты , поэтому он очень новый длямне.

Что мне нужно сделать, это следующее:

  • позволяет пользователю выбрать дату
  • отображать сообщение / предупреждение на основе логики ниже

Если их выбранная дата находится в течение последних 6 месяцев с сегодняшнего дня, они получают скидку.Если их выбранная дата не попадает в последние 6 месяцев сегодняшнего дня, они этого не делают.

Хотя она не работает должным образом, создали скрипку здесь .

Любая помощь будет оценена.Код также ниже;

HTML

<input type="text" class="form-control" id="datepicker" placeholder="Year Graduated" value="" data-date-format="dd/mm/yyyy">
<p id="rate"></p>

JS

  function compareDate() {
    // get date from datepicker
    var dateEntered = $("#datepicker").datepicker("getDate");
    dateEntered = new Date(dateEntered).getTime();
    //alert("date entered: " + dateEntered);
    // set todays date
    var now = new Date();
    // set date six months before today
    var sixMonthBeforeNow = new Date(now).setTime(now.getTime() - 3 * 28 * 24 * 60 * 60);
    //alert("six months before: " + sixMonthBeforeNow);
    // if date entered is within six months from today
    if (dateEntered > sixMonthBeforeNow) {
      alert("You qualify for the discount rate.");
      $("#rate").html('discount rate');
    }
    // if date entered is over six months from today
    if (dateEntered < sixMonthBeforeNow) {
      alert("you graduated more than six months ago");
      $("#rate").html('no discount');
    }
  }

  $("#datepicker").datepicker({
    weekStart: 1,
    daysOfWeekHighlighted: "6,0",
    autoclose: true,
    todayHighlight: true
  });

  $("#datepicker").change(function() {
    compareDate();
  });

Примечание: я бы предпочел не использовать никакие другие сторонние библиотеки / плагины JS.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы должны быть осторожны с арифметикой дат, потому что она не симметрична из-за неравномерной продолжительности месяцев, поэтому вам нужны правила для ее решения.Например, какая дата ровно за 6 месяцев до 31 августа?

Прежде чем ответить, рассмотрите:

  1. 28 февраля плюс 6 месяцев - 28 августа
  2. 1 марта плюс 6 месяцев1 сентября.
  3. Так какая дата составляет 6 месяцев до 29, 30 и 31 августа?Это 28 февраля или 1 марта?

Подобные проблемы возникают для любого последнего дня месяца, в котором месяц, предшествующий 6 месяцам, не имеет 31 дня.Должен ли предел быть 30-го числа месяца или 1-го числа следующего месяца?Когда вы ответили на этот вопрос, вы можете разработать алгоритм для предоставления правильного ответа, а затем код для его реализации.

Если вы хотите, чтобы в таких случаях была установлена ​​дата окончания месяца 6 месяцевраньше вы можете проверить месяц, полученный в результате вычитания 6 месяцев, и, если это не 6, установить последний день предыдущего месяца, например,

function sixMonthsPrior(date) {
  // Copy date so don't affect original
  var d = new Date(date);
  // Get the current month number
  var m = d.getMonth();
  // Subtract 6 months
  d.setMonth(d.getMonth() - 6);
  // If the new month number isn't m - 6, set to last day of previous month
  // Allow for cases where m < 6
  var diff = (m + 12 - d.getMonth()) % 12;
  if (diff < 6) d.setDate(0)
  
  return d;
}

// Helper to format the date
function formatDate(d) {
  return d.toLocaleString(undefined, {day:'2-digit', month:'short', year:'numeric'});
}

// Tests
[ new Date(2018, 7,31), // 31 Aug 2018
  new Date(2018, 8, 1), //  1 Sep 2018
  new Date(2018,11,31), // 31 Dec 2018
  new Date(2019, 2,31)  // 31 Mar 2019
].forEach( d => console.log(formatDate(d) + ' => ' + formatDate(sixMonthsPrior(d))));

Если это не та логика, которую вы хотите применить, вам нужно сказать, что есть.

PS.Вы также можете реализовать вышеуказанную логику, просто сравнив даты начала и окончания (номер дня).Если они разные, то должно быть пролонгировано больше месяца, поэтому установите на 0.

0 голосов
/ 22 мая 2018

Просто измените ваш sixMonthBeforeNow с приведенным ниже кодом, который должен работать.

var sixMonthBeforeNow = new Date(now).setMonth(now.getMonth() - 6);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...