簡體   English   中英

為什么兩個JS日期對象實例化不同?

[英]Why does two JS date Objects instantianted differently?

我想基於日期選擇器啟用/禁用按鈕,我有一個像這樣的檢查設置:

  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,而不是因為檢查有效。

兩個日期對象的初始化方式不同(console.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();
}

我錯過了什么?

改變這個:

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)

無法使用===比較兩個日期,盡管您可以使用< <= >= >來比較它們。

通過onFromChange / onToChange從日期選擇器進入的Date對象看起來像是純日期(它們都在午夜),而使用Date()創建的日期對象將包含當前時間。 js Date類應該被稱為DateTime。 不匹配的時間將導致===比較失敗。

嘗試使用類似的東西在initDatepickers函數中設置availableFromDate和availableToDate:

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

編輯:沒關系,如果這樣做,===仍然會失敗,因為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.

請參閱Salman的答案以獲得正確的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM