我目前使用的是梅氏@mui/x-date-pickers/DatePicker起的DATEPICER库.

以下是我的样例代码

     <LocalizationProvider dateAdapter={AdapterDateFns}>
      <DatePicker
        inputFormat="MM/dd/yy"
        value={date}
        minDate={new Date()}
        disablePast
        onChange={(newValue) => {
          console.log("new value", newValue)
          setDate(newValue);
        }}
        renderInput={(props) => (
          <TextField
            autoFocus
            size="small"
            {...props}
            inputProps={{
              ...props.inputProps,
              autocomplete: 'off',
              placeholder: 'MM/DD/YY',
            }}
          />
        )}
      />
    </LocalizationProvider>

现在,我想使用MM/dd/yy作为日期格式.但当我输入10/30/1999时,返回的日期是10/30/1999.我希望它能在2099年10月30日退还. 这是因为图书馆正在试图预测从当前日期(参考日期)到99年的最接近的年份.

有没有办法确保我只得到future 的约会.因此,在本例中,它返回2099年,而不是1999年.

我试着设置了minDate={new Date()}disablePast,但不起作用.

Codesandbox链接here

先谢谢你.

推荐答案

如果我理解正确的话,您希望使用MM/dd/yy作为日期格式,但结果始终是future 的日期.例如,如果你输入10/30/99,你想得到10/30/2099,而不是10/30/1999.

不幸的是,MUI X Date Picker没有内置的选项来实现这一点.它使用date-fns库来解析日期字符串.这与shortYearCutoff option of jQuery DatePicker类似.

根据date-fns documentation

YY将try 通过接近来猜测两位数年份的世纪 参考日期:

例如:

console.log(parse("11/11/99", "MM/dd/yy", new Date())); // 1999-11-11
console.log(parse("11/11/73", "MM/dd/yy", new Date())); // 1973-11-11
console.log(parse("11/11/72", "MM/dd/yy", new Date())); // 2072-11-11
console.log(parse("11/11/50", "MM/dd/yy", new Date())); // 2050-11-11
console.log(parse("11/11/7", "MM/dd/yy", new Date()));  // 2007-11-11

一种可能的解决方案是重写AdapterDateFnsparse方法.

例如:

class FutureDateAdapter extends AdapterDateFns {
  constructor(props = {}) {
    super(props);
    this.parse = (value, formatString) => {
      if (value === null) {
        return null;
      }
      const date = new Date();
      const newDate = addYears(date, 50);
      return parse(value, formatString, newDate);
    };
  }
}

然后:

<LocalizationProvider dateAdapter={FutureDateAdapter}>
  <DatePicker
    inputFormat="MM/dd/yy"
    value={date}
    onChange={setDate}
    renderInput={(props) => (
      <TextField
        autoFocus
        size="small"
        {...props}
        inputProps={{
          ...props.inputProps,
          autoComplete: "off",
          placeholder: "MM/DD/YY",
        }}
      />
    )}
  />
</LocalizationProvider>;

更新答案

它不处理输入日期介于01/01/23和今天之间的情况.在这种情况下,它将返回过go 的日期而不是future 的日期.

如果您只想获取future 的日期,则可以使用date-fns中的startOfDaycompareAsc方法.

例如:

class FutureDateAdapter extends AdapterDateFns {
  constructor(props = {}) {
    super(props);
    this.parse = (value, formatString) => {
      if (value === null) {
        return null;
      }

      const newDate = new Date();
      const parsedDate = parse(value, formatString, newDate);
      const today = startOfDay(newDate);
      if (compareAsc(parsedDate, today) === -1) {
        return addYears(parsedDate, 100);
      }
      return parsedDate;
    };
  }
}

您可以看到整个示例here.

Reactjs相关问答推荐

为什么Next.js 14无法解析页面路由路径?

Npm运行构建`在Next.js 14中不起作用

App.js中的H2组件不会动态呈现.这可能是什么问题?

为多租户SSO登录配置Azure AD应用程序

是否在Extra Reducer完成作业(job)时触发createListenerMiddleware?

在REACT-RUTER-DOMV6中使用通用页面包装组件有问题吗?

如何修复ReferenceError:在构建过程中未定义导航器

React 在第一次渲染时为 null

列表中的每个子项都应该有一个唯一的keyprops .在react 应用程序中

MERN,将动态列表中的元素插入数组

我如何使用 React toastify (Promise) toast 和邮箱 js

Mui DataGrid 在第二页和前一页上显示项目时出现问题

使用reactrouterdom时显示"对象无效作为React子组件"错误

使用 nextjs App Router 在动态客户端进行服务器端渲染

动态添加或删除文本输入字段并将值设置为 React JS 中主要状态的数组

不能在我的代码中使用 .给我一个警告!有人知道解决方案吗?

MUI 卡组件上的文本未正确对齐

如何用实际的br标签替换axios响应中的br标签?

运行开发服务器时如何为 Vite 指定运行时目录

React 似乎在触发另一个组件时重新渲染了错误的组件