Как узнать, равны ли две даты, игнорируя время?

Я хочу сравнить две даты, чтобы увидеть, совпадают ли они, игнорируя время.

Я пытался использовать метод .setHours(0,0,0,0), чтобы установить время на что-то нейтральное, но тогда я не могу использовать метод .getTime() из-за этой ошибки. Property 'getTime' does not exist on type 'number'

Я также исследовал, что мне не следует использовать ===, но я не могу сначала решить проблему с getTime.

if (this.datelist.filter(x => new Date (x.sentDate).setHours(0,0,0,0).getTime() === this.searchQuery.getTime()).length == 0) {
    console.info("No matches");
}

Возможный дубликат Сравнение только части даты без сравнения времени в JavaScript

Heretic Monkey 25.04.2019 20:18
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
1
71
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Метод Date#setHours уже возвращает время в миллисекундах, поэтому вы не можете использовать метод Date#getTime для Number.

Поскольку метод Date#setHours уже возвращает время, вы можете просто проигнорировать метод Date#getTime и сравнить его с возвращенным значением.

if (this.datelist.filter(x => new Date(x.sentDate).setHours(0,0,0,0) === this.searchQuery.getTime()).length == 0) {
    console.info("No matches");
}


For this purpose, you can use Array#every method instead of Array#fileter method.
if (this.datelist.every(x => new Date(x.sentDate).setHours(0,0,0,0) !== this.searchQuery.getTime())) {
    console.info("No matches");
}

Тьфу, знал, что мне не хватает чего-то простого. Спасибо.

masu9 25.04.2019 20:26

@masu9: рад, что это помогло :)

Pranav C Balan 25.04.2019 20:27

Ваша проблема заключается в объединении методов.

Когда у вас есть thing.methodA().methodB(), methodB будет работать со всем, что возвращается из methodA, и в этом случае setHours возвращает время, НО в миллисекундах, из baseDate, которое является числом и не имеет метода getTime().

Ваше решение использует setHours в обоих объектах после их копирования, это будет:

if (this.datelist.filter(x => new Date (x.sentDate).setHours(0,0,0,0) === this.searchQuery.setHours(0,0,0,0)).length === 0) {
    console.info("nope!");
}

также обратите внимание, что '===' следует использовать во всех случаях, кроме случаев проверки пустых значений (вы используете val == null).

ваше здоровье!

Я настоятельно рекомендую Момент.js для таких операций с датами. С Moment.js все намного проще

moment('2019-04-25').isSame('2019-04-25'); // true

Существуют методы форматирования, позволяющие преобразовать дату в ГГГГ-ММ-ДД перед сравнением.

Другие вопросы по теме