检查两个日期是否具有相同的日期信息。

124

如何检查两个不同的日期对象是否具有相同的日期信息(即是否具有相同的日、月、年等)?我尝试过“==”、“===”和.equals,但都不起作用。

9个回答

191
你可以使用 valueOf() 或者 getTime():
a = new Date(1995,11,17);
b = new Date(1995,11,17);

a.getTime() === b.getTime() // prints true

21
因为在 >= 的情况下,值会被转换成数字。而在 == 的情况下,对象本身会被进行比较(只有 a == a 会返回真)。 - Felix Kling
12
提醒一下,这个解决方案要求日期只包括日期部分,而许多来到这个问题的人可能有不同的要求(在 jsFiddle 上带有时间部分的示例)。 - KyleMit
2
因此,在使用此功能时,请确保时间部分设置为0,感谢 setHours 函数a.setHours(0,0,0,0); - COil
4
如果存在毫秒差异,这个方法将行不通。由于getTime()返回的是以毫秒为单位的时间,两个时间也可能有毫秒的差异。在这个解决方案中,它将无法按预期工作。尝试使用toDateString() - Rehan Sattar

81
如果您只想检查日期是否在同一天而不考虑时间,则可以使用toDateString()方法进行比较。此方法仅返回日期而不包括时间:method
var start = new Date('2015-01-28T10:00:00Z');
var end = new Date('2015-01-28T18:00:00Z');

if (start.toDateString() === end.toDateString()) {
  // Same day - maybe different times
} else {
  // Different day
}

49

我使用了这段代码:

Date.prototype.isSameDateAs = function(pDate) {
  return (
    this.getFullYear() === pDate.getFullYear() &&
    this.getMonth() === pDate.getMonth() &&
    this.getDate() === pDate.getDate()
  );
}

然后你可以像这样调用它:if (aDate.isSameDateAs(otherDate)) { ... }


为什么要运行十几个函数,当你只能使用getTime()两次?哦,你在考虑忽略小时、月份和年份之间的差异吗?如果是这样,那么时区的考虑就开始变得重要了。 - ErikE
15
因为问题是“两个不同的日期对象具有相同的日期信息”,而这段代码正是在比较日期,而不考虑时间。请修饰此句以使其更通俗易懂,但不要改变原意。 - Incidently
2
我想说的是“忽略小时、分钟和秒钟的差异”。 - ErikE
根据问题的确切描述,这实际上是正确的答案,尽管“日期信息”可能存在歧义。 - Eddie

20

将类型转换为整数:

a = new Date(1995,11,17);
b = new Date(1995,11,17);
+a === +b;  //true

4
很棒的一元运算符使用。 - KingOfHypocrites

8
Hellnar,
你可以尝试以下函数(请原谅函数名称:) - 经Felix修改,使用valueOf而非getTime):
function isEqual(startDate, endDate) {
    return endDate.valueOf() == startDate.valueOf();
}

使用方法:

if(isEqual(date1, date2)){
   // do something
}

这可能会帮助你部分地解决问题。

另请参见:

'http://www.java2s.com/Tutorial/JavaScript/0240__Date/DatevalueOf.htm'


5

如果要确定两个日期是否相等,忽略时间部分,可以使用简单的单行代码:

function isSameDate(a, b) {
    return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
}

它确定日期a和b是否相差不超过一天并且共享同一周的某一天。

function isSameDate(a, b) {
    return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
}

console.log(isSameDate(new Date(2017, 7, 21), new Date(2017, 7, 21))); //exact same date => true
console.log(isSameDate(new Date(2017, 7, 21, 23, 59, 59), new Date(2017, 7, 21))); //furthest same dates => true
console.log(isSameDate(new Date(2017, 7, 20, 23, 59, 59), new Date(2017, 7, 21))); //nearest different dates => false
console.log(isSameDate(new Date(2016, 7, 21), new Date(2017, 7, 21))); //different year => false
console.log(isSameDate(new Date(2017, 8, 21), new Date(2017, 7, 21))); //different month => false


5

将它们相减并与零进行比较:

var date1 = new Date();
var date2 = new Date();

// 处理日期方面的操作...

(date1 - date2) ? alert("not equal") : alert("equal");

将其存入变量中:

var datesAreSame = !(date1 - date2);

4

为了更好地支持日期,请使用 moment.jsisSame 方法。

var starDate = moment('2018-03-06').startOf('day');
var endDate  = moment('2018-04-06').startOf('day');

console.log(starDate.isSame(endDate)); // false ( month is different )

var starDate = moment('2018-03-06').startOf('day');
var endDate  = moment('2018-03-06').startOf('day');

console.log(starDate.isSame(endDate)); // true ( year, month and day are the same )

0

我喜欢使用这段代码

function isEqualDate(d1, d2) {
    return (
        d1.toISOString().startsWith(d2.toISOString().substring(0,10)) 
    );
}

console.log(isEqualDate(new Date(2022,2,2,10,57), new Date(2022,2,2,11,57)) )

console.log(isEqualDate(new Date(), new Date(2022,2,2)) )

console.log(isEqualDate(new Date(), new Date()) )


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接