下面的代码有什么问题?
也许只比较日期而不是时间会更简单。我也不确定如何做到这一点,我搜索了一下,但我找不到我的确切问题。
顺便说一句,当我在警报中显示这两个日期时,它们显示完全相同。
我的代码:
window.addEvent('domready', function() {
var now = new Date();
var input = $('datum').getValue();
var dateArray = input.split('/');
var userMonth = parseInt(dateArray[1])-1;
var userDate = new Date();
userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
if (userDate > now)
{
alert(now + '\n' + userDate);
}
});
有没有一种更简单的方法来比较日期而不包括时间?
我还在学习JavaScript,我找到的唯一方法是比较两个没有时间的日期,使用Date对象的sehours方法,并将小时、分钟、秒和毫秒设置为零。然后比较这两个日期。
例如,
date1 = new Date()
date2 = new Date(2011,8,20)
Date2将小时、分钟、秒和毫秒设置为0,但date1将它们设置为date1创建的时间。要去掉date1上的小时、分钟、秒和毫秒,请执行以下步骤:
date1.setHours(0,0,0,0)
现在您可以将两个日期仅作为日期进行比较,而不必担心时间元素。
使用javascript,您可以将现有日期对象的时间值设置为零,然后解析回日期。解析回Date后,两者的Time值都为0,您可以进行进一步的比较
let firstDate = new Date(mydate1.setHours(0, 0, 0, 0));
let secondDate = new Date(mydate2.setHours(0, 0, 0, 0));
if (selectedDate == currentDate)
{
console.log('same date');
}
else
{
console.log(`not same date`);
}
比较日期和时间:
var t1 = new Date(); // say, in ISO String = '2022-01-21T12:30:15.422Z'
var t2 = new Date(); // say, in ISO String = '2022-01-21T12:30:15.328Z'
var t3 = t1;
比较2个日期对象的毫秒级:
console.log(t1 === t2); // false - Bcos there is some milliseconds difference
console.log(t1 === t3); // true - Both dates have milliseconds level same values
仅根据日期比较2个日期对象(忽略任何时间差):
console.log(t1.toISOString().split('T')[0] === t2.toISOString().split('T')[0]);
// true; '2022-01-21' === '2022-01-21'
仅通过时间(ms)比较2个日期对象(忽略任何日期差异):
console.log(t1.toISOString().split('T')[1] === t3.toISOString().split('T')[1]);
// true; '12:30:15.422Z' === '12:30:15.422Z'
以上2个方法使用toISOString()方法,因此您无需担心国家之间的时区差异。
使用Moment.js
如果您可以选择包含第三方库,那么绝对值得一看Moment.js。它使使用Date和DateTime变得非常非常容易。
例如,查看一个Date是否紧跟在另一个Date之后,但排除它们的时间,你会这样做:
var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00
// Comparison including time.
moment(date2).isAfter(date1); // => true
// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false
传递给isAfter的第二个参数是进行比较的精度,可以是年、月、周、日、小时、分钟或秒中的任何一个。
比较日期的有效而正确的方法是:
Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);
它忽略了时间部分,适用于不同的时区,你也可以比较是否相等==。86400000为一天的毫秒数(= 24*60*60*1000)。
注意,相等操作符==永远不应该用于比较Date对象,因为当你期望相等测试工作时,它会失败,因为它是比较两个Date对象(而不是比较两个日期):
> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300
> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300
> date1 == date2;
outputs: false
> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true
注意:如果你比较的Date对象的时间部分设置为0,那么你可以使用date1.getTime() == date2.getTime(),但它几乎不值得优化。在直接比较Date对象时,可以使用<、>、<=或>=,因为这些操作符首先在操作符进行比较之前调用. valueof()来转换Date对象。