为什么两个JS日期对象实例化的方式不同?

时间:2019-02-22 10:05:10

标签: javascript typescript date

我想基于日期选择器启用/禁用按钮,并且我有一个检查设置,如下所示:

  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}`);
  }

支票向上有效,但是当起始日期较低时启用按钮! 如果您将值记录到控制台,则be按钮将被禁用,因为init值为false,而不是因为检查有效。

两个日期对象的初始化方式不同(console.log转储):

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 :(得分:3)

更改此:

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)

cannot compare two dates with ===,尽管您可以使用< <= >= >进行比较。

答案 1 :(得分:1)

看来,从日期选择器通过onFromChange / onToChange传入的Date对象是纯日期(它们都在午夜),而使用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的答案以找到适当的解决方案。