Перевірка, чи мають дві дати однакову інформацію про дату


83

Як я можу перевірити, чи мають два різні об’єкти дати однакову інформацію про дату (з однаковим днем, місяцем, роком ...)? Я пробував "==", "===" та .equals, але, здається, жоден не працює.

Відповіді:


139

Ви можете використовувати valueOf()або getTime():

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

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

18
Тому що у випадку >=значення перетворюються в числа. У випадку, ==якщо об'єкти порівнюються між собою (і лише a == aце буде правдою).
Фелікс Клінг

8
Тільки вказуючи, що це рішення вимагає, щоб дати складалися лише з частин дати, тоді як багато людей, які приходять до цього питання, можуть мати різні вимоги ( приклад із часовими частинами в jsFiddle )
KyleMit

1
Тому, використовуючи це, переконайтеся, що часові частини встановлені на 0 завдяки функції setHours :a.setHours(0,0,0,0);
COil

1
Це не спрацює, якщо є різниця в мілісекундах. Оскільки getTime()повертає час у мілісекундах, обидва рази також можуть мати різницю в мілісекундах. У цьому рішенні воно не буде працювати належним чином. Спробуйте скористатисяtoDateString()
Rehan

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
е-е, я мав на увазі сказати "ігноруючи різницю в годині, хвилині та секунді"
ErikE

14

Введіть перетворити на цілі числа:

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

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 )

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.