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

TypeScript中如何从字符串类型的日期中减去一天?

解决方案:用Moment.js正确给字符串日期减一天

我来帮你搞定这个问题!你之前的代码没生效,大概率是因为没有正确把减一天后的结果赋值回要使用的变量,或者处理时机不对。下面针对你的两个方法分别给出修改方案:

1. 修改ngOnChanges方法中的endDate处理

原来的代码里,你直接对传入的this.endDate做格式化,现在需要先转成Moment对象、执行减一天操作,再格式化输出。修改后的代码如下:

public ngOnChanges(): void {
  const startDate = this.startDate ? moment(this.startDate).format() : moment().startOf('day').format();
  // 这里修改:如果有传入endDate,先减一天再格式化;否则保持原有逻辑
  const endDate = this.endDate 
    ? moment(this.endDate).subtract(1, 'day').format() 
    : moment(startDate).endOf('day').format();
  this.datePicker = new DatePicker(startDate, endDate);
  this.setDatePicker();
  if (this.continiousDatesValue !== null) {
    this.continiousDatesValueMoment = moment(this.continiousDatesValue);
  }
  if (this.previousDatesValue !== null) {
    this.previousDatesValueMoment = moment(this.previousDatesValue);
  }
}

2. 修改onDatesChange方法中的endDate发射逻辑

如果需要在发射endDate之前也执行减一天操作,那要对this.datePicker.endDate做同样的Moment处理,再发射出去:

private onDatesChange(): void {
  this.startDateChange.emit(this.datePicker.startDate);
  // 这里修改:对datePicker的endDate先减一天再格式化后发射
  const adjustedEndDate = moment(this.datePicker.endDate).subtract(1, 'day').format();
  this.endDateChange.emit(adjustedEndDate);
  this.startEndDateChange.emit({
    startDate: this.datePicker.startDate, 
    endDate: adjustedEndDate
  });
  this.isOpen = false;
}

关键注意点

  • 确保你已经正确安装并导入了Moment.js:import * as moment from 'moment';
  • 如果你的endDate字符串格式不标准,可能需要在moment()里指定格式,比如moment(this.endDate, 'YYYY-MM-DD'),避免Moment解析出错导致减一天失效
  • 如果你后续还要对datePicker里的日期做其他操作,也可以考虑直接在DatePicker实例中存储Moment对象,而不是格式化后的字符串,这样后续修改会更方便

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:11