在JavaScript中比较新日期失败
我正在尝试为dataTables开发自定义日期范围过滤器。用户可以在两个输入中输入开始日期和结束日期,并过滤整个表格。在JavaScript中比较新日期失败
输入开始日期和结束日期时,结果相符。当我只输入其中一个时,结果失败。例如;起始日期是2017年12月1日,但我可以看到实例与日期29-11-2016 ...我的过滤代码:
$('#filter').on('click', function(e) {
e.preventDefault();
var startDate = $('#start').val(),
endDate = $('#end').val();
filterByDate(10, startDate, endDate); // We call our filter function
$dTable.dataTable().fnDraw(); // Manually redraw the table after filtering
});
var filterByDate = function(column, startDate, endDate) {
$.fn.dataTableExt.afnFiltering.push(
function(oSettings, aData, iDataIndex) {
var rowDate = normalizeDate(aData[10]),
start = normalizeDate(startDate),
end = normalizeDate(endDate);
// If our date from the row is between the start and end
if (start <= rowDate && rowDate <= end) {
console.log(start <= rowDate);
return true;
} else if (rowDate >= start && end === '' && start !== ''){
console.log(rowDate >= start && end === '' && start !== '');
return true;
} else if (rowDate <= end && start === '' && end !== ''){
return true;
} else {
return false;
}
}
);
};
var normalizeDate = function(dateString) {
var date = new Date(dateString);
var normalized = ("0" + date.getDate()).slice(-2) + '/'+ (("0" + (date.getMonth() + 1)).slice(-2)) + '/' +date.getFullYear() ;
return normalized;
};
可能一些JavaScript天才帮助我获得的rowData >= start....
比较和rowDate <= end....
工作正常吗?输入日期由/
分隔,在我的表格中由/
分隔,但normalizeData函数使它们具有相同的布局。
您可以使用以下两个日期比较!
在本例中,您使用UNIX时间戳来比较两个日期。
if ((new Date(startDate).getTime() > new Date(endDate).getTime())) {
// start date is greater than end date
}
if ((new Date(startDate).getTime() < new Date(endDate).getTime())) {
// start date is lower than end date
}
工作片断:
var startDate = document.getElementById('start').value;
var endDate = document.getElementById('end').value;
if ((new Date(startDate).getTime() > new Date(endDate).getTime())) {
console.log("start date is greater than end date")
}
if ((new Date(startDate).getTime() < new Date(endDate).getTime())) {
console.log("start date is lower than end date")
}
<input id="start" value="10/10/2017"/>
<input id="end" value="12/10/2017"/>
请不要推荐使用Date构造函数解析字符串,它充其量是有问题的。应该使用一个真正的解析器,一个库或简单的(可能是3行)函数。 * getTime *返回的值是[*时间值*](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-time-values-and-time-range) ,这是毫秒。 “UNIX时间戳”是秒,虽然它使用与ECMAScript相同的纪元(它由许多系统和语言(如Java)共享)。 – RobG
我知道这个问题,我会稍后更新答案和.split()字符串,并在去日期之后..感谢您的建议:) – Felix
这里有一个想法:
将您dates
为Unix时间戳和比较这些来代替。您可以使用date.getTime()
来执行此转换。
如slezica上下面的评论说:
getTime()
返回自1970年1月1日0小时毫秒的量。这是一个你可以比较的简单数字。
例子:
var date1 = new Date(1995, 11, 17);
var date2 = new Date(2005, 12, 25);
if (date2.getTime() > date1.getTime()) {
console.log("date 2 is later than date 1");
}
什么是* dateString *的价值?在使用Date构造函数解析字符串之前,请考虑[*为什么Date.parse会给出不正确的结果*](http://stackoverflow.com/questions/2587345/why-does-date-parse-give-incorrect-results)。 – RobG