Проверка того, что две даты имеют одинаковую информацию о дате

83

Как я могу проверить, имеют ли два разных объекта даты одинаковую информацию о дате (с одинаковым днем, месяцем, годом ...)? Я пробовал "==", "===" и .equals, но, похоже, ни один из них не работает.

Hellnar
источник

Ответы:

139

Вы можете использовать valueOf()или getTime():

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

a.getTime() === b.getTime() // prints true
Феликс Клинг
источник
18
Потому что в случае >=значения конвертируются в числа. В случае, ==если объекты сравниваются сами (и только a == aтак).
Felix Kling
8
Просто укажу, что это решение требует, чтобы даты состояли только из частей даты, в то время как многие люди, которые задаются этим вопросом, могут иметь разные требования ( пример с частями времени в jsFiddle )
KyleMit
1
Поэтому при использовании этого убедитесь, что части времени установлены на 0 благодаря функции setHours :a.setHours(0,0,0,0);
COil
1
Это не сработает, если есть разница в миллисекундах. Поскольку getTime()возвращает время в миллисекундах, оба времени также могут иметь разницу в миллисекундах. В этом решении это не будет работать должным образом. Попробуйте использоватьtoDateString()
Рехан Саттар
41

Если вас интересует только проверка того, происходят ли даты в один и тот же день независимо от времени, вы можете использовать этот toDateString() метод для сравнения. Этот метод возвращает только дату без времени:

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
}
кибервомбат
источник
40

Я использовал этот код:

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

Тогда вы просто называете это так: if (aDate.isSameDateAs(otherDate)) { ... }

Кстати
источник
Зачем вам запускать дюжину функций, если вы можете использовать getTime () всего дважды? О, вы не думали игнорировать разницу в часах, месяцах и годах? В этом случае, может быть, соображения часового пояса начинают иметь значение?
ErikE
13
Потому что вопрос был в том, что «два разных объекта даты имеют одинаковую информацию о дате», и этот код делает именно это: сравнивает даты независимо от времени
кстати,
2
э, я хотел сказать «игнорировать разницу в часах, минутах и
секундах
14

Введите преобразование в целые числа:

a = new Date(1995,11,17);
b = new Date(1995,11,17);
+a === +b;  //true
d2vid
источник
4
потрясающее использование
унарного
6

Хеллнар,

вы можете попробовать (простите за имя функции :) - исправлено для значения felix, а не для 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'

Джим Толлан
источник
4

Для лучшей даты поддержки использования moment.js и isSame метод

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 )
que1326
источник
3

вычтите их и сравните с нулем:

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

// что-то делаем с датами ...

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

чтобы поместить его в переменную:

var datesAreSame = !(date1 - date2);
Эге Озджан
источник
3

Простая однострочная альтернатива для определения равенства двух дат без учета временной части:

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

Филип Бийкер
источник