FED实验室 - 专注WEB端开发和用户体验

Javascript中判断两个日期相等

点滴Javascript 煦涵 11742℃ 0评论

在我们日常开发中,涉及到日期对象时,最常见的可能是判断一个日期是否和另一个日期相等,对应大多数程序员来说,可能会使用下面这种方式来做比较:

/**
 * [isTeachersDay 是否是教师节]
 * @param  {[type]}  date [description]
 * @return {Boolean}      [description]
 */
function isTeachersDay (date) {
    var teacherDay = new Date("09/10/2014");

    return (date === teacherDay);
}

//Outputs: false
console.log(isTeachersDay(new Date("09/10/2014")));

上例没有返回true,是因为像JS#41判断对象是否相等一文中提到的,判断两个对象是否相等,不能更加对象的值来判断是否相等,而要根据标识符来判断。换句话说,如果一个对象不是两一个对象的拷贝,这两个对象就不可能相等。

为了使上例达到我们期望的结果,我们进行如下改造:

/**
 * [isTeachersDay 是否是教师节]
 * @param  {[type]}  date [description]
 * @return {Boolean}      [description]
 */
function isTeachersDay (date) {
    var teacherDay = new Date("09/10/2014");

    return date.getTime() === teacherDay.getTime();
}

//Outputs: true
console.log(isTeachersDay(new Date("09/10/2014")));

其中getTime()返回距1970年1月1日午夜(GMT时间)之间的毫秒数。

但是我们又有个疑问,如果我们比较两个日期在同一天的不同小时呢,结果又会怎么样?

function isTeachersDay (date) {
    var teacherDay = new Date("09/10/2014");

    return date.getTime() === teacherDay.getTime();
}

//Outputs: false
console.log(isTeachersDay(new Date("09/10/2014 12:00")));

上例结果仍然没有达到我们的期望。

如果要比较相同日期的不同小时相等,我们可以比较日期的年、月、日是否相等:

function isTeachersDay (date) {
    console.log(date.getDate());
    return date.getFullYear() === 2014 &&
           date.getMonth()    === 8    &&
           date.getDate()     === 10;
}

//Outputs: true
console.log(isTeachersDay(new Date("09/10/2014 11:00")));

尽管我们达到预期的目标。但是,它并没有考虑到的时区的复杂性及本地UTC / GMT时间。

由于这些复杂性,所以一般最好是依靠一个强大的、成熟的库Moment.js来做,如日期比较。

但最重要的,你必须要知道不能使用等号运算符来判断两个日期是否相等。

感谢您的阅读,希望本文对您有所帮助,文中不足之处还望批评斧正。

下面是「FED实验室」的微信公众号二维码,欢迎扫描关注:

FED实验室

行文不易,如有帮助,欢迎打赏!

赞赏支持or喜欢 (1)or分享 (0)
捐赠共勉
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽