Moment.js - 日期比较:捕获最小范围
Moment.js - Date comparison: Catching min range
我的表单有一个 Kendo DatePicker 和一个在执行 form.submit() 之前运行 JavaScript 函数的按钮。我需要能够将我输入的日期与下限进行比较,如果它早于我设定的日期,则阻止代码继续(提交表格)。如果没有违反限制,我想 return 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!
,所以我不敢用
由于您使用的是 moment.js,所以根本不要使用 JavaScript 日期对象。仅坚持时刻对象。
//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();
您已经在使用 moment,只需将 kendo 选择器的日期转换为 moment 对象并使用 isAfter
或 isBefore
。
如果这不起作用,请提供选择器可能 return 不适合您的日期
我的表单有一个 Kendo DatePicker 和一个在执行 form.submit() 之前运行 JavaScript 函数的按钮。我需要能够将我输入的日期与下限进行比较,如果它早于我设定的日期,则阻止代码继续(提交表格)。如果没有违反限制,我想 return 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!
,所以我不敢用
由于您使用的是 moment.js,所以根本不要使用 JavaScript 日期对象。仅坚持时刻对象。
//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();
您已经在使用 moment,只需将 kendo 选择器的日期转换为 moment 对象并使用 isAfter
或 isBefore
。
如果这不起作用,请提供选择器可能 return 不适合您的日期