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

React Datepicker报Uncaught RangeError: Invalid time value问题求助

React DatePicker选择日期后崩溃:Uncaught RangeError: Invalid time value 解决思路

核心问题分析

AddTask组件中,DatePicker的selected属性绑定了task.startDate,初始值是Date对象。但选择日期时,你通过handleInputChange将task.startDate修改为字符串格式的日期(如"2024-05-20"),而selected属性要求传入合法的Date对象,字符串无法被识别,导致渲染时抛出Invalid time value错误。

对比Task组件的差异:Task组件里的DatePicker使用的是value属性而非selected,value支持字符串格式的日期,因此不会触发错误。


解决方案

方案1:保持state中startDate为Date对象(推荐)

直接将DatePicker选择的Date对象存入state,避免类型转换错误:

// 修改AddTask组件中的DatePicker
<DatePicker
  selected={ task.startDate }
  onChange={date => setTask({ ...task, startDate: date })} // 直接赋值Date对象
  name="startDate"
  dateFormat="yyyy-MM-dd"
/>

同时,在提交给后端时,将Date对象转为后端需要的字符串格式:

// 修改saveTask中的data定义
var data = {
  title: task.title,
  description: task.description,
  startDate: task.startDate.toISOString().split("T")[0] // 转为"yyyy-MM-dd"格式字符串
};

提交成功后,将后端返回的日期字符串转回Date对象:

// 修改saveTask中的setTask逻辑
setTask({
  id: response.data.id,
  title: response.data.title,
  description: response.data.description,
  completed: response.data.completed,
  startDate: new Date(response.data.startDate) // 转回Date对象
});

方案2:统一用字符串格式存储日期

如果希望state中始终存储字符串格式的日期,需要将selected属性的字符串转为Date对象:

// 第一步:修改初始state的startDate为字符串
const initialTaskState = {
  id: null,
  title: "",
  description: "",
  completed: false,
  startDate: new Date().toISOString().split("T")[0] // 初始值为"yyyy-MM-dd"字符串
};

// 第二步:修改DatePicker的selected属性
<DatePicker
  selected={ new Date(task.startDate) } // 将字符串转为Date对象
  onChange={date => handleInputChange({target: {value: date.toISOString().split("T")[0], name: 'startDate'}})}
  name="startDate"
  dateFormat="yyyy-MM-dd"
/>

注意:确保后端返回的startDate是合法的日期字符串,否则new Date()会返回无效日期,仍会触发错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:40:27