当用户在 angular 中键入年份字段时,angular 中的日期字段将月份减 1

Date field in angular reducing month by 1 when user keying in year field in angular

我在 HTML

中定义了一个日期字段
<input type="date" name=""  (change)="handleBlur($event)" min="1970-01-01" max="9999-12-31"
       value="{{ somedate| date:'yyyy-MM-dd' }}">

并且在 ts 文件中我正在处理 onchange 事件

    handleBlur(event: any) {
   this.somedate= new Date(event.target.value).toISOString()
    console.log('after', this.somedate)
    this.formobject.controls['somedate'].setValue(this.somedate)
    this.appService.updateSaveDataValue({ somedate: this.somedate})
  }

此日期控件在某些 X 个国家/地区非常有效,但在其他国家/地区则不然。我的意思是用户可以从日历控件中选择一个日期,也可以输入一个日期值。但是,当用户使用来自美国地区的相同工具时,此控件的行为会很奇怪。当年份改变时,每键入一次,日减一,而当用户改变日时,月份减一。我不知道如何解决它或导致问题的原因。

JavaScript 日期对象有一个时间部分。 new Date(...) 将创建一个新的 Date 对象,时间为用户当前时区的 'now'。将该日期对象转换为 ISO 字符串时,它将标准化时间组件,这可能会导致日期本身发生变化。

例如,假设我 select 2022 年 4 月 2 日正好在 12:30am 时区 GMT+1 上午。在此日期对象上调用 .toISOString() 时,它将转换为 GMT+0 的 11:30pm 2022 年 4 月 1 日。这也可能在接近午夜的时间发生相反的情况。

为避免这种情况,您可以根据日期对象上的日、月和年手动创建 ISO 字符串,或者您可以请求图书馆帮助您完成此操作。有几个库可以帮助管理日期,例如 momentjs、Day.js、date-fns 等