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

如何让MUI X Date Pickers支持公元前(BCE)年份?

解决MUI X DatePicker设置公元前年份出现重复key警告问题

问题根源

date-fns处理公元前年份时,公元1年(CE)和公元前1年(BCE)的yyyy格式化结果均为0001,导致DatePicker年份选择器内部生成的选项key重复,触发React的重复key警告。

解决方案

通过自定义年份格式化逻辑,给公元前年份的key添加唯一标识,区分开同数字的公元/公元前年份。

方法1:自定义renderYear组件

直接在DatePicker中覆盖年份选项的key生成逻辑:

import { DatePicker, PickerDay } from '@mui/x-date-pickers';
import { format } from 'date-fns';

// 生成唯一年份key的函数
const getUniqueYearKey = (date) => {
  const year = date.getFullYear();
  return year < 0 ? `B-${Math.abs(year).toString().padStart(4, '0')}` : year.toString().padStart(4, '0');
};

// 使用DatePicker
<DatePicker
  minDate={new Date(-1, 0, 1)} // 设置公元前1年为最小日期
  renderYear={(yearDate, selectedDate, pickersDayProps) => (
    <PickerDay
      {...pickersDayProps}
      key={getUniqueYearKey(yearDate)}
    >
      {format(yearDate, yearDate.getFullYear() < 0 ? 'yyyy BCE' : 'yyyy')}
    </PickerDay>
  )}
  // 其他属性如label、value等...
/>

方法2:全局自定义date-fns本地化

通过修改date-fns适配器的本地化配置,全局处理年份显示和key生成:

import { LocalizationProvider } from '@mui/x-date-pickers';
import { createDateFnsAdapter } from '@mui/x-date-pickers/date-fns-adapter';
import { enUS } from 'date-fns/locale';

// 自定义本地化配置
const customLocale = {
  ...enUS,
  formatLong: {
    ...enUS.formatLong,
    year: (date) => {
      const year = date.getFullYear();
      return year < 0 ? `${Math.abs(year)} BCE` : `${year}`;
    },
  },
};

// 创建自定义适配器
const CustomDateAdapter = createDateFnsAdapter({ locale: customLocale });

// 包裹应用组件
<LocalizationProvider dateAdapter={CustomDateAdapter}>
  <DatePicker minDate={new Date(-1, 0, 1)} />
</LocalizationProvider>

说明

两种方法核心都是给公元前年份的标识添加区分前缀(如B-),确保公元1年和公元前1年的key分别为0001和B-0001,避免重复。同时可以优化年份显示,让用户清晰区分公元/公元前年份。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:47:36