如何在JS中检查日期是否相等

267 阅读2分钟

译者:王二狗

我写博客主要用来整理我还不懂的知识,那些我精通的东西,往往没有动力写。炫耀从来不是我的动机,好奇才是。—— 阮一峰

当在日常的编程工作中使用日期时,程序员最常见的需求之一是检查一个日期是否与另一个日期相匹配。

大多数的程序员都会用下面这种方式来处理日期:

function isChristmas (dateToTest) {
    var christmas = new Date("12/25/2014");
    return (dateToTest === christmas);
}

不幸的是,这个函数将始终返回false。

console.log(isChristmas(new Date("12/25/2014")));
// => false

之所示始终返回false是因为,两个对象要做到相等,仅仅值相等时无法判定相等的,必须要值和引用都相同,才能做到两个对象都相等。

下面我们来修改一下我们的代码:

function isChristmas (dateToTest) {
    var christmas = new Date("12/25/2014");
    return (dateToTest.getTime() === christmas.getTime());
}

经过这种方式处理之后,我们就可以得到正确的结果:

console.log(isChristmas(new Date("12/25/2014")));
// => true

但是当我们比较一个在同一天但是不同时间的日期对象时,我们又会遇到一个新的问题:

console.log(isChristmas(new Date("12/25/2014 12:00")));
// => false

遇到这种情况我们采取的处理措施是仅仅对年份、月份和日期进行检查:

function isChristmas (dateToTest) {
    return (dateToTest.getFullYear() === 2014) &&
           // getMonth is 0-indexed
           (dateToTest.getMonth() === 11) &&
           (dateToTest.getDate() == 25);
}

console.log(isChristmas(new Date("12/25/2014 12:00")));
// => true

尽管这个函数现在可以工作了,但是还是存在许多的弊端,比如没有考虑时区的复杂性。

所以我们通常倾向于依赖像Moment.js这样的健壮且测试良好的库来进行日期比较之类的事情。

但最重要的是,你现在知道了比较日期不要使用JS的相等运算符。

告诫自己,即使再累也不要忘记学习,成功没有捷径可走,只有一步接着一步走下去。 共勉!