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

如何将MUI Datepicker选中的日期值转换为YYYY-MM-DD格式?

问题原因

你当前用的是AdapterDayjs作为日期适配器,所以DatePicker的onChange回调返回的newValue是Dayjs对象,不是原生Date对象。直接把Dayjs对象传给moment()时,moment没法正确解析,会默认生成当前日期,这就是你拿到错误结果的原因。

解决方案

两种处理方式任选其一即可:

方式一:改用Moment日期适配器

既然要用到moment.js,直接把MUI的日期适配器换成AdapterMoment,这样DatePicker会直接返回moment对象,不用额外转换:

import * as React from "react";
import moment from "moment";
import TextField from "@mui/material/TextField";
// 替换成Moment适配器
import { AdapterMoment } from "@mui/x-date-pickers/AdapterMoment";
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
import { DatePicker } from "@mui/x-date-pickers/DatePicker";

export default function BasicDatePicker() {
  const [value, setValue] = React.useState(null);

  return (
    <LocalizationProvider dateAdapter={AdapterMoment}>
      <DatePicker
        label="Basic example"
        value={value}
        onChange={(newValue) => {
          // 此时newValue是moment对象,直接格式化
          const formattedDate = newValue.format("YYYY-MM-DD");
          console.log("格式化后日期", formattedDate);
          setValue(newValue);
          // 这里可以把formattedDate作为请求payload使用
        }}
        renderInput={(params) => <TextField {...params} />}
      />
    </LocalizationProvider>
  );
}

方式二:继续用Dayjs适配器,转换后处理

如果不想换适配器,先把Dayjs对象转成原生Date对象,再传给moment:

import * as React from "react";
import moment from "moment";
import TextField from "@mui/material/TextField";
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
import { DatePicker } from "@mui/x-date-pickers/DatePicker";

export default function BasicDatePicker() {
  const [value, setValue] = React.useState(null);

  return (
    <LocalizationProvider dateAdapter={AdapterDayjs}>
      <DatePicker
        label="Basic example"
        value={value}
        onChange={(newValue) => {
          // 先将Dayjs对象转为原生Date
          const nativeDate = newValue.toDate();
          const formattedDate = moment(nativeDate).format("YYYY-MM-DD");
          console.log("格式化后日期", formattedDate);
          setValue(newValue);
          // 使用formattedDate作为请求payload
        }}
        renderInput={(params) => <TextField {...params} />}
      />
    </LocalizationProvider>
  );
}

嫌麻烦的话,甚至可以直接用Dayjs自带的格式化方法,不用moment:

// 无需导入moment,直接用Dayjs的format方法
const formattedDate = newValue.format("YYYY-MM-DD");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:15:57