Moment.js - Сравнение дат: минимальный диапазон отлова

Моя форма имеет Kendo DatePicker и кнопку, которая выполняет функцию JavaScript перед выполнением form.submit(). Мне нужно иметь возможность сравнивать введенную дату с нижним пределом и не допускать продолжения работы кода (отправки формы), если она раньше установленной даты. Я хочу вернуть false, если предел не был нарушен, true, если он есть. Я буду использовать этот пример, чтобы показать, что я пытаюсь сделать в коде проверки:

var lowerBound = new Date('1776', '6','4');  // July 4, 1776
var dateField = $('#myDateField').val();  // <-- comes from Kendo DatePicker
var dateToConsider = new Date(dateField);  // if this is 1/1/0001, this changes to 1/1/1901... not good, so I do this, instead....

var arrDate = dateField.split('/'); // I also check for '-', ' ', and '.'
dateToConsider = arrDate[2] + '-' + arrDate[0] + '-' arrDate[1]; // could add 'T00:00:00Z'; but don't think it matters

var momentDTC = moment(dateToConsider);
var lowerLimitBreached = moment(lowerBound).isAfter(momentDTC); // <-- this is always false

if (!lowerLimitBreached)
    $('form').submit();

Я вводил 1/1/0001 в элемент управления, и он продолжает давать lowerLimitBreached как ложь, когда это должно быть правдой, поскольку 1-1-0001 явно раньше, чем 7-4-1776... Я пытался использовать .isBefore(), но встретились с той же проблемой, и документация на самом деле говорит NOTE: moment().isBefore() has undefined behavior and should not be used! так что я не смею этим пользоваться.

Документация по моментам: http://momentjs.com/docs/

2 ответа

Решение

Поскольку вы используете moment.js, вообще не используйте объект JavaScript Date. Придерживайтесь только моментальных объектов.

//evaluates correctly
moment('0001-01-01');

//evaluates to Feb 2, 0001 - makes no sense...
new Date(Date.parse('0001-02-03'))
                            //^ but that's a 3, not a 2

//true - Jan 1, 0001 is before June 4, 1776
moment('0001-01-01').diff(moment('1776-06-04')) < 0

Итак, глядя на ваш код, попробуйте это:

var lowerBound = moment('1776-06-04');
var dateField = $('#myDateField').val();

// String replace and put in proper format for moment
dateField = dateField.replace(/(\/)/g,'-');
var year = dateField.split('-')[2];
var month = dateField.split('-')[0];
var day = dateField.split('-')[1];

if (month < 10) { month = "0" + month; }
if (day < 10) { day = "0" + day; }
dateField = year + '-' + month + '-' + day;

// Enter into moment and compare
var dateToConsider = moment(dateField);
var lowerLimitBreached = dateToConsider.diff(lowerBound) < 0;

if (lowerLimitBreached)
    $('form').submit();

Почему ты не делаешь это?

var lowerBound = moment('1776-6-4');
var dateField = moment($('#myDateField').val());
var lowerLimitBreached = moment(lowerBound).isAfter(dateField);

if (!lowerLimitBreached)
    $('form').submit();

Вы уже используете момент, просто конвертируйте дату выбора кендо в объект момента и используйте isAfter или же isBefore,

Если это не сработает, пожалуйста, укажите дату, когда сборщик может вернуться, это не работает для вас

Другие вопросы по тегам