React中DatePicker设置format后提交的日期仍是ISO格式怎么办?
我在用react-datepicker组件时遇到了奇怪的问题,设置format参数后界面显示正常,但表单提交时日期还是ISO格式字符串。比如选2024-05-01,显示变成05/01/2024,但控制台打印的值还是”2024-05-01T00:00:00″。
import DatePicker from 'react-datepicker';
function MyForm() {
const [startDate, setStartDate] = useState(new Date());
return (
setStartDate(date)}
format="dd/MM/yyyy" // 这里设置了格式
showTimeSelect
/>
);
}
试过添加customFormat函数也不行,表单提交时直接取startDate.toISOString()反而正常,但这样用户看到的界面显示就会错乱。难道format属性只影响显示不改变实际值?
react-datepicker组件的format属性只影响界面显示格式,并不会改变实际存储的日期对象。也就是说,不管你设置了什么format,内部的startDate状态依然是一个标准的JavaScriptDate对象,而它的默认字符串化方式就是ISO格式。要解决这个问题,你需要在提交表单时手动将
Date对象格式化成你需要的字符串格式,而不是直接用toISOString()方法。下面我详细说一下解决方案:### 1. 引入日期处理库
最简单的方式是使用一个日期处理库,比如
dayjs或者moment(虽然moment有点重)。这里以dayjs为例,因为它轻量且功能强大。先安装
dayjs:### 2. 修改代码逻辑
我们需要在表单提交时对日期进行格式化,而不是直接用
toString()或toISOString()。下面是完整的代码示例:
### 3. 解释为什么这样做
-
react-datepicker的dateFormat属性只是控制输入框中显示的日期格式,并不会改变你传入的Date对象。- JavaScript 的
Date对象本质上是一个时间戳,它本身的字符串表示形式是 ISO 格式的。所以如果你直接打印startDate,就会看到 ISO 格式的字符串。- 使用
dayjs或类似的库可以让你灵活地将日期对象格式化成任何你需要的字符串格式。### 4. 其他注意事项
- 如果你觉得引入外部库太麻烦,也可以自己写一个简单的格式化函数,不过这样可能会让代码变得冗长且不够优雅。
- 确保你的服务器端能够正确解析前端发过去的日期字符串格式。例如,如果前端发过去的是 "05/01/2024",后端需要知道这是日/月/年的格式。
这样改完之后,表单提交时输出的日期就是用户看到的格式了,问题完美解决!