Сейчас я работаю над системой, в которой есть правила, основанные на диапазонах дат,

Пользователь может отправить форму, мне нужно проверить, чтобы входные данные соответствовали 1 из 3 диапазонов дат. В основном 2 даты должны быть в пределах 1 из 3 следующих правил,

01/01 - 30/04 01/05 - 30/09 01/10 - 31/12,

Мне нужно выяснить, какой месяц имеет начальная дата и какой месяц имеет конечная дата, и если конечная дата находится за пределами диапазона, запишите ее.

Таким образом, в основном, если пользователь отправил 01.01.2017 в качестве даты начала и 10.02.2017 в качестве даты окончания, это будет действительный ввод, но если пользователь введет 01.01.2017 в качестве даты начала, и 01/06/2017 в качестве конечной даты, которая будет недействительной, так как дата охватывает более одного диапазона дат.

Можно ли проверить подобные вещи с помощью JavaScript? Я прошел через различные сценарии, кроме диапазонов в массивах и проверке значений массивов, но я продолжаю попадать в беспорядок.

-1
Udders 8 Дек 2016 в 16:20

3 ответа

Лучший ответ

Вы можете просто проверить, находится ли дата в диапазоне с помощью getTime ()

JSBin

const isDateInRage = (startDate, endDate) => (dateToCheck) => {
  return dateToCheck >= startDate && dateToCheck <= endDate
}

const isInRangeOne = isDateInRage('2016-01-01', '2016-04-30')

console.log('inRange', isInRangeOne('2016-01-02'))
console.log('outtOfRange', isInRangeOne('2016-07-02'))
2
MoeSattler 9 Дек 2016 в 14:46

Попробуй это

// parse string 'XX/XX/XXXX' to create date object
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function daysBetween(date1, date2) {
    return Math.round((parseDate(date1)-parseDate(date2)) / (1000*60*60*24));
}

if(daysBetween('01/01/2017', '01/06/2017') > 1) {
    // Your code here
}
0
16kb 8 Дек 2016 в 13:38

Рассмотрим функцию для проверки дат начала и окончания для каждого из диапазонов и возврата true, как только он уместится в одном из них. Вам нужно будет правильно проанализировать строки, а также использовать год с начальной или конечной даты и применить его к диапазонам.

Приведенная ниже функция использует дату начала и возвращает true, если начало и конец соответствуют одному из диапазонов, и false в противном случае. Если предоставленные даты начала или окончания недействительны, выдается ошибка.

// Parse date in yyyy-mm-dd format as local date
function parseYMD(s) {
  var b = s.split(/\D/);
  var d = new Date(b[0], --b[1], b[2]);
  return d && d.getMonth() == b[1]? d : new Date(NaN);
}

// Check start and end date are within one of the valid ranges
var checkInRange = (function () {
  // Bespoke parser
  function parsePart(p, y) {
    p = p.split(/\D/);
    return new Date(y, p[1]-1, p[0]);
  }
  // Valid ranges as d/m, year is taken from start date
  var validRanges = ['01/01 - 30/04','01/05 - 30/09','01/10 - 31/12'];
    
  return function (startDate, endDate) {
    var dStart = parseYMD(startDate);
    var dEnd   = parseYMD(endDate);
    // Throw error if input dates aren't valid
    if (isNaN(dStart) || isNaN(dEnd)) {
      throw new Error('start or end date is invalid')
    }
    var year = dStart.getFullYear();
    // Return true if range is within valid ranges
    return validRanges.some(function(range) {
      var r = range.split(' - ').map(function(s){return parsePart(s, year)});
      return dStart >= r[0] && dEnd <= r[1];
    });
  }
})(); 

// Some tests
[['2016-01-01','2016-04-30'],['2016-03-30','2016-04-30'],['2017-04-30','2017-05-01']].
  forEach(function(dates) {
    console.log('Start and end: ' + dates[0] + ' - ' + dates[1] +
                '\nValid range?: ' + checkInRange(dates[0],dates[1]));
  });

Не используйте конструктор Date (или Date.parse) для разбора строк. Их поведение во многом зависит от реализации. Дата формата ISO 8601 будет проанализирована как UTC, что нормально в этом контексте, если все строки анализируются одинаково, однако, если это не так, пользователи будут

0
RobG 9 Дек 2016 в 02:24