Back to Ant Design

DatePicker

components/date-picker/index.zh-CN.md

6.3.719.5 KB
Original Source

何时使用 {#when-to-use}

当用户需要输入一个日期,可以点击标准输入框,弹出日期面板进行选择。

代码演示 {#examples}

<!-- prettier-ignore -->

<code src="./demo/basic.tsx">基本</code> <code src="./demo/range-picker.tsx">范围选择器</code> <code src="./demo/multiple.tsx" version="5.14.0">多选</code> <code src="./demo/multiple-debug.tsx" debug>多选 Debug</code> <code src="./demo/needConfirm.tsx" version="5.14.0">选择确认</code> <code src="./demo/switchable.tsx">切换不同的选择器</code> <code src="./demo/format.tsx">日期格式</code> <code src="./demo/time.tsx">日期时间选择</code> <code src="./demo/mask.tsx" version="5.14.0">格式对齐</code> <code src="./demo/date-range.tsx" version="5.14.0">日期限定范围</code> <code src="./demo/disabled.tsx">禁用</code> <code src="./demo/disabled-date.tsx">不可选择日期和时间</code> <code src="./demo/allow-empty.tsx">允许留空</code> <code src="./demo/select-in-range.tsx">选择不超过一定的范围</code> <code src="./demo/preset-ranges.tsx">预设范围</code> <code src="./demo/extra-footer.tsx">额外的页脚</code> <code src="./demo/size.tsx">三种大小</code> <code src="./demo/cell-render.tsx">定制单元格</code> <code src="./demo/components.tsx" version="5.14.0">定制面板</code> <code src="./demo/external-panel.tsx">外部使用面板</code> <code src="./demo/buddhist-era.tsx" version="5.14.0">佛历格式</code> <code src="./demo/status.tsx">自定义状态</code> <code src="./demo/variant.tsx" version="5.13.0">形态变体</code> <code src="./demo/style-class.tsx" version="6.0.0">自定义语义结构的样式和类</code> <code src="./demo/filled-debug.tsx" debug>Filled Debug</code> <code src="./demo/placement.tsx">弹出位置</code> <code src="./demo/mode.tsx" debug>受控面板</code> <code src="./demo/start-end.tsx" debug>自定义日期范围选择</code> <code src="./demo/suffix.tsx">前后缀</code> <code src="./demo/render-panel.tsx" debug>_InternalPanelDoNotUseOrYouWillBeFired</code> <code src="./demo/component-token.tsx" debug>组件 Token</code> <code src="./demo/suffixIcon-debug.tsx" debug>suffixIcon</code>

API

通用属性参考:通用属性

日期类组件包括以下五种形式。

  • DatePicker
  • DatePicker[picker="month"]
  • DatePicker[picker="week"]
  • DatePicker[picker="year"]
  • DatePicker[picker="quarter"] (4.1.0 新增)
  • RangePicker

国际化配置

默认配置为 en-US,如果你需要设置其他语言,推荐在入口处使用我们提供的国际化组件,详见:ConfigProvider 国际化

如有特殊需求(仅修改单一组件的语言),请使用 locale 参数,参考:默认配置

jsx
// 默认语言为 en-US,如果你需要设置其他语言,推荐在入口文件全局设置 locale
// 确保还导入相关的 dayjs 文件,否则所有文本的区域设置都不会更改(例如范围选择器月份)
import locale from 'antd/locale/zh_CN';
import dayjs from 'dayjs';

import 'dayjs/locale/zh-cn';

dayjs.locale('zh-cn');

<ConfigProvider locale={locale}>
  <DatePicker defaultValue={dayjs('2015-01-01', 'YYYY-MM-DD')} />
</ConfigProvider>;
<!-- prettier-ignore -->

:::warning 在搭配 Next.js 的 App Router 使用时,注意在引入 dayjs 的 locale 文件时加上 'use client'。这是由于 Ant Design 的组件都是客户端组件,在 RSC 中引入 dayjs 的 locale 文件将不会在客户端生效。 :::

共同的 API

以下 API 为 DatePicker、 RangePicker 共享的 API。

参数说明类型默认值版本
allowClear自定义清除按钮boolean | { clearIcon?: ReactNode }true5.8.0: 支持对象类型
bordered是否带边框,请使用 variant 替代booleantrue-
className选择器 classNamestring-
classNames用于自定义组件内部各语义化结构的 class,支持对象或函数Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string>-
dateRender自定义日期单元格的内容,5.4.0 起用 cellRender 代替function(currentDate: dayjs, today: dayjs) => React.ReactNode-< 5.4.0
cellRender自定义单元格的内容(current: dayjs, info: { originNode: React.ReactElement,today: DateType, range?: 'start' | 'end', type: PanelMode, locale?: Locale, subType?: 'hour' | 'minute' | 'second' | 'meridiem' }) => React.ReactNode-5.4.0
components自定义面板Record<Panel | 'input', React.ComponentType>-5.14.0
defaultOpen是否默认展开控制弹层boolean-
disabled禁用booleanfalse
disabledDate不可选择的日期(currentDate: dayjs, info: { from?: dayjs, type: Picker }) => boolean-info: 5.14.0
dropdownClassName弹出日历的 className,请使用 classNames.popup.root 替代string--
format设置日期格式,为数组时支持多格式匹配,展示以第一个为准。配置参考 dayjs#format。示例:自定义格式formatType@rc-component/picker
order多选、范围时是否自动排序booleantrue5.14.0
preserveInvalidOnBlur失去焦点是否要清空输入框内无效内容booleanfalse5.14.0
popupClassName额外的弹出日历 className,使用 classNames.popup.root 替代string-4.23.0
getPopupContainer定义浮层的容器,默认为 body 上新建 divfunction(trigger)-
inputReadOnly设置输入框为只读(避免在移动设备上打开虚拟键盘)booleanfalse
locale国际化配置object默认配置
minDate最小日期,同样会限制面板的切换范围dayjs-5.14.0
maxDate最大日期,同样会限制面板的切换范围dayjs-5.14.0
mode日期面板的状态(设置后无法选择年份/月份?time | date | month | year | decade-
needConfirm是否需要确认按钮,为 false 时失去焦点即代表选择。当设置 multiple 时默认为 falseboolean-5.14.0
nextIcon自定义下一个图标ReactNode-4.17.0
open控制弹层是否展开boolean-
panelRender自定义渲染面板(panelNode) => ReactNode-4.5.0
picker设置选择器类型date | week | month | quarter | yeardatequarter: 4.1.0
placeholder输入框提示文字string | [string, string]-
placement选择框弹出的位置bottomLeft bottomRight topLeft topRightbottomLeft
popupStyle额外的弹出日历样式,使用 styles.popup.root 替代CSSProperties{}
prefix自定义前缀ReactNode-5.22.0
prevIcon自定义上一个图标ReactNode-4.17.0
previewValue当用户选择日期悬停选项时,输入字段的值会发生临时更改false | hoverhover6.0.0
presets预设时间范围快捷选择, 自 5.8.0 起 value 支持函数返回值{ label: React.ReactNode, value: Dayjs | (() => Dayjs) }[]-
size输入框大小,large 高度为 40px,small 为 24px,默认是 32pxlarge | medium | small-
status设置校验状态'error' | 'warning'-4.19.0
style自定义输入框样式CSSProperties{}
styles用于自定义组件内部各语义化结构的行内 style,支持对象或函数Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties>-
suffixIcon自定义的选择框后缀图标ReactNode-
superNextIcon自定义 >> 切换图标ReactNode-4.17.0
superPrevIcon自定义 << 切换图标ReactNode-4.17.0
variant形态变体outlined | borderless | filled | underlinedoutlined5.13.0 | underlined: 5.24.0
onOpenChange弹出日历和关闭日历的回调function(open)-
onPanelChange日历面板切换的回调function(value, mode)-
onSelect选中日期时的回调,请使用 onCalendarChange 替代function(value)--

共同的方法

名称描述版本
blur()移除焦点
focus()获取焦点

DatePicker

参数说明类型默认值版本
defaultPickerValue默认面板日期,每次面板打开时会被重置到该日期dayjs-5.14.0
defaultValue默认日期,如果开始时间或结束时间为 null 或者 undefined,日期范围将是一个开区间dayjs-
disabledTime不可选择的时间function(date)-
format展示的日期格式,配置参考 dayjs#formatformatTypeYYYY-MM-DD
multiple是否为多选,不支持 showTimebooleanfalse5.14.0
pickerValue面板日期,可以用于受控切换面板所在日期。配合 onPanelChange 使用。dayjs-5.14.0
renderExtraFooter在面板中添加额外的页脚(mode) => React.ReactNode-
showNow显示当前日期时间的快捷选择boolean-
showTime增加时间选择功能Object | booleanTimePicker Options
showTime.defaultValue请使用 showTime.defaultOpenValuedayjsdayjs()5.27.3
showTime.defaultOpenValue设置用户选择日期时默认的时分秒,例子dayjsdayjs()
showWeekDatePicker 下展示当前周booleanfalse5.14.0
value日期dayjs-
onChange时间发生变化的回调function(date: dayjs | null, dateString: string | null)-
onOk点击确定按钮的回调function()-
onPanelChange日期面板变化时的回调function(value, mode)-

DatePicker[picker=year]

参数说明类型默认值版本
defaultValue默认日期dayjs-
format展示的日期格式,配置参考 dayjs#formatformatTypeYYYY
multiple是否为多选booleanfalse5.14.0
renderExtraFooter在面板中添加额外的页脚() => React.ReactNode-
value日期dayjs-
onChange时间发生变化的回调,发生在用户选择时间时function(date: dayjs | null, dateString: string | null)-

DatePicker[picker=quarter]

4.1.0 新增。

参数说明类型默认值版本
defaultValue默认日期dayjs-
format展示的日期格式,配置参考 dayjs#formatformatTypeYYYY-\QQ
multiple是否为多选booleanfalse5.14.0
renderExtraFooter在面板中添加额外的页脚() => React.ReactNode-
value日期dayjs-
onChange时间发生变化的回调,发生在用户选择时间时function(date: dayjs | null, dateString: string | null)-

DatePicker[picker=month]

参数说明类型默认值版本
defaultValue默认日期dayjs-
format展示的日期格式,配置参考 dayjs#formatformatTypeYYYY-MM
multiple是否为多选booleanfalse5.14.0
renderExtraFooter在面板中添加额外的页脚() => React.ReactNode-
value日期dayjs-
onChange时间发生变化的回调,发生在用户选择时间时function(date: dayjs | null, dateString: string | null)-

DatePicker[picker=week]

参数说明类型默认值版本
defaultValue默认日期dayjs-
format展示的日期格式,配置参考 dayjs#formatformatTypeYYYY-wo
multiple是否为多选booleanfalse5.14.0
renderExtraFooter在面板中添加额外的页脚(mode) => React.ReactNode-
value日期dayjs-
onChange时间发生变化的回调,发生在用户选择时间时function(date: dayjs | null, dateString: string | null)-
showWeekDatePicker 下展示当前周booleantrue5.14.0

RangePicker

参数说明类型默认值版本
allowEmpty允许起始项部分为空[boolean, boolean][false, false]
cellRender自定义单元格的内容。(current: dayjs, info: { originNode: React.ReactElement,today: DateType, range?: 'start' | 'end', type: PanelMode, locale?: Locale, subType?: 'hour' | 'minute' | 'second' | 'meridiem' }) => React.ReactNode-5.4.0
dateRender自定义日期单元格的内容,5.4.0 起用 cellRender 代替function(currentDate: dayjs, today: dayjs) => React.ReactNode-< 5.4.0
defaultPickerValue默认面板日期,每次面板打开时会被重置到该日期dayjs[]-5.14.0
defaultValue默认日期dayjs[]-
disabled禁用起始项[boolean, boolean]-
disabledTime不可选择的时间function(date: dayjs, partial: start | end, info: { from?: dayjs })-info.from: 5.17.0
format展示的日期格式,配置参考 dayjs#formatformatTypeYYYY-MM-DD HH:mm:ss
id设置输入框 id 属性。{ start?: string, end?: string }-5.14.0
pickerValue面板日期,可以用于受控切换面板所在日期。配合 onPanelChange 使用。dayjs[]-5.14.0
presets预设时间范围快捷选择,自 5.8.0 起 value 支持函数返回值{ label: React.ReactNode, value: (Dayjs | (() => Dayjs))[] }[]-
renderExtraFooter在面板中添加额外的页脚() => React.ReactNode-
separator设置分隔符React.ReactNode<SwapRightOutlined />
showTime增加时间选择功能Object|booleanTimePicker Options
showTime.defaultValue请使用 showTime.defaultOpenValuedayjs[][dayjs(), dayjs()]5.27.3
showTime.defaultOpenValue设置用户选择日期时默认的时分秒,例子dayjs[][dayjs(), dayjs()]
value日期dayjs[]-
onCalendarChange待选日期发生变化的回调。info 参数自 4.4.0 添加function(dates: [dayjs, dayjs], dateStrings: [string, string], info: { range:start|end })-
onChange日期范围发生变化的回调function(dates: [dayjs, dayjs] | null, dateStrings: [string, string] | null)-
onFocus聚焦时回调function(event, { range: 'start' | 'end' })-range: 5.14.0
onBlur失焦时回调function(event, { range: 'start' | 'end' })-range: 5.14.0

formatType

typescript
import type { Dayjs } from 'dayjs';

type Generic = string;
type GenericFn = (value: Dayjs) => string;

export type FormatType =
  | Generic
  | GenericFn
  | Array<Generic | GenericFn>
  | {
      format: string;
      type?: 'mask';
    };

注意:type 定义为 5.14.0 新增。

Semantic DOM

<code src="./demo/_semantic.tsx" simplify="true"></code>

主题变量(Design Token){#design-token}

<ComponentTokenTable component="DatePicker"></ComponentTokenTable>

FAQ

当我指定了 DatePicker/RangePicker 的 mode 属性后,点击后无法选择年份/月份? {#faq-mode-cannot-select}

请参考常见问答

为何日期选择年份后返回的是日期面板而不是月份面板? {#faq-year-to-date-panel}

当用户选择完年份后,系统会直接切换至日期面板,而非显式提供月份选择。这样做的设计在于用户只需进行一次点击即可完成年份修改,无需再次点击进入月份选择界面,从而减少了用户的操作负担,同时也避免需要额外感知月份的记忆负担。

如何在 DatePicker 中使用自定义日期库(如 Moment.js )? {#faq-custom-date-library}

请参考《使用自定义日期库》

为什么时间类组件的国际化 locale 设置不生效? {#faq-locale-not-work}

参考 FAQ 为什么时间类组件的国际化 locale 设置不生效?

如何修改周的起始日? {#faq-week-start-day}

请使用正确的语言包#5605),或者修改 dayjs 的 locale 配置:https://codesandbox.io/s/dayjs-day-of-week-x9tuj2?file=/demo.tsx

js
import dayjs from 'dayjs';

import 'dayjs/locale/zh-cn';

import updateLocale from 'dayjs/plugin/updateLocale';

dayjs.extend(updateLocale);
dayjs.updateLocale('zh-cn', {
  weekStart: 0,
});

为何使用 panelRender 时,原来面板无法切换? {#faq-panel-render-switch}

当你通过 panelRender 动态改变层级结构时,会使得原本的 Panel 被当做新的节点删除并创建。这使得其原本的状态会被重置,保持结构稳定即可。详情请参考 #27263

如何理解禁用时间日期? {#faq-disabled-date-time}

欢迎阅读博客《为什么禁用日期这么难?》了解如何使用。