Почему два объекта даты JS инстанцируются по-разному? - PullRequest
0 голосов
/ 22 февраля 2019

Я хотел бы включить / отключить кнопку на основе средства выбора даты, и у меня есть настройка для проверки, подобная этой:

  public dateChanged = false;
  public availableFromDate: Date;
  public availableToDate: Date;

 initDatepickers() {
    const currentDay = new Date();
    this.availableFromDate = currentDay;
    this.availableToDate = currentDay;
  }

 private dateCheck() {
    if ((this.availableFromDate > this.availableToDate) || (this.availableFromDate === this.availableToDate)) {
      this.dateChanged = false;
    } else {
      this.dateChanged = true;
    }
    console.log(this.dateChanged);
    console.log(`Available from - ${this.availableFromDate}`);
    console.log(`Available to - ${this.availableToDate}`);
  }

Проверка работает хорошо вверх и активирует кнопку, когда издата ниже, однако!Если вы регистрируете значения в консоли, кнопка будет отключена, потому что значение init равно false, а не потому, что проверка работает.

Два объекта даты инициализируются по-разному (dump.log dump):

true
clinics-upload-documents.component.ts:73 Available from - Fri Feb 22 2019 00:00:00 GMT+0100 (Central European Standard Time)
clinics-upload-documents.component.ts:74 Available to - Fri Feb 22 2019 10:52:31 GMT+0100 (Central European Standard Time)

Это никогда не будет ложным, потому что первая дата obj равна @ 0:00:00, а вторая привязана к текущему местному времени.

они используются для манипулирования датами:

onFromChange(fromDate) {
  const dateType = 'from';
  this.setDateValues(fromDate, dateType);
}
onToChange(toDate) {
  const dateType = 'to';
  this.setDateValues(toDate, dateType);
}
private setDateValues(date: Date, dateType: string) {
  dateType === 'from' ? this.availableFromDate = new Date(date) : this.availableToDate = new Date(date);
  this.dateCheck();
}

Что мне так не хватает?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Похоже, что объекты Date, поступающие из вашего средства выбора даты через onFromChange / onToChange, являются чистыми датами (все они в полночь), в то время как объекты даты, созданные вами с помощью Date (), будут иметь текущее время.Класс js Date действительно должен был называться DateTime.Несоответствие времени приведет к сбою сравнения ===.

Попробуйте использовать что-то вроде этого для установки availableFromDate и availableToDate в вашей функции initDatepickers:

private getCurrentDate() {
    const date = new Date();
    date.setHours(0);
    date.setMinutes(0);
    date.setSeconds(0);
    date.setMilliseconds(0);
}

EDIT: Nevermind, === все равно не будет выполнен, если вы сделаете это, потому что Date являетсяобъект, поэтому === проверяет равенство ссылок.Два объекта Date могут содержать одинаковые базовые значения даты / времени, но они по-прежнему считаются отдельными объектами.Однако такие вещи, как числа, являются типами значений, поэтому === сообщит, равны ли эти два значения.Например:

5 === 5; // True, because pure numbers are value types
const number1 = { number: 5 }; // This is an object, so it is a reference type. Dates are also objects.
const number2 = { number: 5 }; // Another reference type
number1 === number2; // False, because although number1 and number2 hold the same values, they are still distinct objects.

См. Ответ Салмана для правильного решения.

0 голосов
/ 22 февраля 2019

Измените это:

const currentDay = new Date();
this.availableFromDate = currentDay;
this.availableToDate = currentDay;

На это:

const currentDay = new Date();
currentDay.setHours(0, 0, 0, 0);
this.availableFromDate = new Date(currentDay);
this.availableToDate = new Date(currentDay);

Это приведет к обнулению части времени и прямому сравнению даты.

Далее, изменитеэто:

if (
   (this.availableFromDate > this.availableToDate) ||
   (this.availableFromDate === this.availableToDate)
)

Для этого (при условии, что вы хотите проверить больше или равно):

if (this.availableFromDate >= this.availableToDate)

Вы не можете сравнить две даты с === хотя вы можете сравнить их, используя < <= >= >.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...