You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中FormControl日期转Date对象出现1970初始日期问题求助

日期字符串转Date对象出现1970-01-01问题的解决方法

问题重现

HTML代码

<form [formGroup]="searchForm" (ngSubmit)="search()">
  <div class="row">
    <div class="col">
      <input type="date" class="form-control" formControlName="startDate" >
    </div>
    <div class="col">
      <input type="date" class="form-control" formControlName="endDate" >
    </div>
    <div class="col">
      <button type="submit" class="btn btn-primary">Submit</button>
    </div>
  </div>
</form>

TypeScript代码

searchForm = new FormGroup({
    startDate: new FormControl(),
    endDate: new FormControl(),
  }
);

问题描述

直接打印this.searchForm.value.startDate时,输出为2022-12-31,符合预期。但执行startDate = new Date(this.searchForm.value.startDate)转换为Date对象时,结果却是1970-01-01T00:00:00。

原因分析

核心问题是:input[type="date"]返回的YYYY-MM-DD格式字符串,在部分JavaScript环境或旧版浏览器中,Date构造函数对这种仅含日期的ISO字符串解析存在时区或逻辑差异,导致无法正确识别日期,最终返回代表时间起点的Epoch时间(1970-01-01)。

解决方法

方法1:拆分日期字符串手动构造Date对象

这是最可靠的方式,完全避免解析歧义:

const dateStr = this.searchForm.value.startDate;
if (dateStr) {
  const [year, month, day] = dateStr.split('-').map(Number);
  // 注意:Date构造函数的月份是0-based(0对应1月,11对应12月)
  const startDate = new Date(year, month - 1, day);
  console.log(startDate); // 输出正确的Date对象
}

方法2:给日期字符串补充时间后缀

通过添加T00:00:00明确时间部分,让Date构造函数能准确解析:

const dateStr = this.searchForm.value.startDate;
if (dateStr) {
  const startDate = new Date(`${dateStr}T00:00:00`);
  console.log(startDate);
}

方法3:配置FormControl直接返回Date对象

初始化表单时添加值转换逻辑,让控件直接返回Date类型:

searchForm = new FormGroup({
  startDate: new FormControl(null),
  endDate: new FormControl(null)
});

// 监听日期控件值变化,自动转换为Date对象
this.searchForm.get('startDate')?.valueChanges.subscribe(dateStr => {
  if (dateStr) {
    const [year, month, day] = dateStr.split('-').map(Number);
    this.searchForm.get('startDate')?.setValue(new Date(year, month - 1, day), { emitEvent: false });
  }
});

内容的提问来源于stack exchange,提问作者komkit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:51:45