输入类 · DatePicker
日期选择器
日期选择器用于帮助用户选择一个符合要求的、格式化的日期(时间)或日期(时间)范围

代码演示

如何引入

基本使用

小尺寸

使用 density 可以控制日期面板的尺寸,compact 为小尺寸,default 为默认尺寸。

多个日期选择

将 multiple 设为 true,可以多选日期

日期与时间选择

将 type 设定为 dateTime,可以选择日期时间。
版本V2.22.0开始,我们将 TimePicker 内的 ScrollItem 的默认模式从 wheel 变更为了 normal, 若想应用回无限滚动的效果,可以通过 timePickerOpts 传入特定配置开启。

日期范围选择

将 type 设定为 dateRange,可以选择日期范围
注意事项
type=dateRange 或 dateTimeRange 时,只有开始日期和结束日期都被选择后才会触发 onChange。

日期范围时间选择

将 type 设定为 dateTimeRange, 可以选择日期时间范围
当未传入 defaultValue 或 value时,底部面板默认时间为当前时间。如果你有特殊需求(如指定默认时分秒),可以通过 defaultPickerValue 指定

内嵌输入框

使用 insetInput 可以控制日期面板是否展示内嵌输入框,默认为 false。v2.7.0 后支持。内嵌输入框适用于以下场景:
  • 日期时间选择,可以直接通过内嵌输入框单独修改时间,无须通过滚轮选择时间
  • 自定义触发器时 + 范围选择,使用内嵌输入框可以单独对开始和结束日期进行修改
insetInput 开启后包括以下功能:
  • 点击触发器后,面板默认在原有位置弹出。你可以通过 position 自定义弹出位置
  • 点击内嵌日期输入框,面板切换到日期选择;点击内嵌时间输入框,面板切换到时间选择
  • 和外部的输入框一致,如果输入了非法日期,面板关闭后日期会回到之前的合法日期
注意事项
注意,开启后会对组件做一些调整和限制:
  1. 触发器样式:未打开面板时触发器只读,打开时触发器禁用
  2. 面板样式:type 包括 time 时,隐藏底部的切换按钮
  3. 开启 insetInput 后 format 只支持 dateFormat[ timeFormat] 格式,使用其他格式会影响内嵌输入框 placeholder 和触发器文本的展示

同步切换双面板月份

在范围选择的场景中, 开启 syncSwitchMonth 则允许双面板同步切换。默认为 false。
Note:点击年份按钮也会同步切换两个面板,从滚轮里面切换年月不会同步切换面板,这保证了用户选择非固定间隔月份的能力。

切换面板日期的回调

onPanelChange 回调函数会在面板的月份或年份切换改变时被调用。

周选择

dateRange 搭配 startDateOffset 和 endDateOffset 可以进行单击范围选择,如周选择、双周选择。

年月选择

将 type 设定为 month,可以进行年月选择。

年月范围选择

版本: >= 2.32.0
将 type 设定为 monthRange,可以进行年月范围选择。暂不支持小尺寸与快捷面板。

确认日期时间选择

对于“日期时间”(type="dateTime")或“日期时间范围”(type="dateTimeRange")的选择,可以进行确认后才将值写入输入框内,你可以通过传递 needConfirm=true 来开启这种行为。
同时支持 “确认”(onConfirm) 和 “取消”(onCancel) 两个按钮的点击回调。
下面这个例子绑定了 onChange、onConfirm、onCancel 三种回调,你可以打开控制台查看打印信息的区别。
注意:开启确认选择时,需要点击取消按钮关闭面板,点击空白区域不再关闭面板(v2.2.0)

带有快捷方式的日期时间选择

通过 presets 设定快捷日期选择

渲染顶部/底部额外区域

通过 topSlot 和 bottomSlot 可以自定义渲染顶部和底部额外区域
通过 leftSlot 和 rightSlot 可以自定义渲染左侧和右侧额外区域(v2.65.0后支持)

禁用日期选择

禁用部分日期或时间

传入 disabledDate 可以禁用指定日期,传入 disabledTime 可以禁用指定时间,配合 defaultPickerValue 可以指定面板打开时所处的年月。
disabledDate 和 disabledTime,接受的入参都为当前日期,前者返回一个 boolean 值,后者返回一个对象,将会透传给 TimePicker 组件。
注意事项
当你使用 timeZone 时,第一个参数为你选择的时区下时间(与onChange的第一个返回值类似)
在 type 包含 range 时,可以根据当前选择动态禁止日期。options 参数 1.9.0 后支持。
范围选择时,可以根据 focus 状态禁用日期。focus 状态通过 options 中的 rangeInputFocus 参数传递。

自定义显示格式

可以通过 format 自定义显示格式

自定义触发器

默认情况下我们使用 Input 组件作为 DatePicker 组件的触发器,通过传递 triggerRender 方法你可以自定义这个触发器。
自定义触发器是对触发器的完全自定义,默认的清除按钮将不生效,如果你需要清除功能,请自定义一个清除按钮。
注意事项
范围选择时,面板打开后默认选择的日期为开始日期,选择后会切到结束日期选择。面板关闭后焦点会重置。
我们建议提供一个清除按钮,当你给 DatePicker 传入空值时,DatePicker 内部也会重置焦点。这样用户可以在清除后重新选择日期范围。(from v2.15)

自定义日期显示内容

renderDate: (dayNumber: number, fullDate: string) => ReactNode,自定义日期内容。
  • dayNumber:当前日。如 13。
  • fullDate:当前日的完整日期。如 2020-08-13。

自定义日期格子渲染

renderFullDate: (dayNumber: number, fullDate: string, dayStatus: object) => ReactNode, 自定义日期格子的渲染内容。
dayStatus 表示当前格子的状态,包括的 key 有:

API 参考

属性说明类型默认值版本
autoAdjustOverflow浮层被遮挡时是否自动调整方向booleantrue
autoFocus自动获取焦点booleanfalse
autoSwitchDate通过面板上方左右按钮、下拉菜单更改年月时,自动切换日期。仅对 date type 生效。booleantrue
borderless无边框模式boolean2.33.0
bottomSlot渲染底部额外区域ReactNode
className类名string-
clearIcon可用于自定义清除按钮, showClear为true时有效ReactNode2.25.0
defaultOpen面板默认显示或隐藏booleanfalse
defaultPickerValue默认面板日期ValueType
defaultValue默认值ValueType
density面板的尺寸,可选值:default, compactstringdefault
disabled是否禁用booleanfalse
disabledDate日期禁止判断方法,返回为 true 时禁止该日期,options 参数 1.9.0 后支持,其中 rangeEnd 1.29 后支持,rangeInputFocus 2.22 后支持
(date, options) => boolean
() => false
disabledTime时间禁止配置,返回值将会作为参数透传给 TimePicker
(date, panelType) => object
() => false
disabledTimePicker是否禁止时间选择boolean
dropdownClassName下拉列表的 CSS 类名string
dropdownStyle下拉列表的内联样式object
dropdownMargin下拉列表算溢出时的增加的冗余值,详见issue#549,作用同 Tooltip marginobject|number2.25.0
endDateOffsettype 为 dateRange 时,设置单击选择范围的结束日期(selectedDate?: Date) => Date;-
format在输入框内展现的日期串格式string与 type 对应:详见日期时间格式
getPopupContainer指定父级 DOM,弹层将会渲染至该 DOM 中,自定义需要设置 position: relative 这会改变浮层 DOM 树位置,但不会改变视图渲染位置。function():HTMLElement() => document.body
hideDisabledOptions隐藏禁止选择的时间booleanfalse
insetInput面板中是否嵌入输入框,InsetInputProps 类型 v2.29 支持boolean |
InsetInputProps
false2.7.0
inputReadOnly文本框是否 readonlybooleanfalse
inputStyle输入框样式object
leftSlot渲染左侧额外区域ReactNode2.65.0
maxmultiple 为 true 时,多选的数目,不传或者值为 null|undefined 的话无限制number-
motion是否开启面板展开的动画booleantrue
multiple是否可以选择多个,仅支持 type="date"booleanfalse
needConfirm是否需要“确认选择”,仅 type="dateTime"|"dateTimeRange" 时有效boolean
open面板显示或隐藏的受控属性boolean
placeholder输入框提示文字string|string[]'Select date'
position浮层位置,可选值同Popover#API 参考·position 参数string'bottomLeft'
prefix前缀内容string|ReactNode
presets日期时间快捷方式, start 和 end 在 v2.52 版本支持函数类型
Array
[]
preventScroll指示浏览器是否应滚动文档以显示新聚焦的元素,作用于组件内的 focus 方法boolean
presetPosition日期时间快捷方式面板位置, 可选值'left', 'right', 'top', 'bottom'string'bottom'2.18.0
rangeSeparator自定义范围类型输入框的日期分隔符string'~'
rangeSeparatorNode自定义范围类型输入框分隔符的渲染节点(仅影响 UI 渲染,字符串解析仍使用 rangeSeparator)ReactNode-
renderDate自定义日期显示内容(dayNumber, fullDate) => ReactNode-
renderFullDate自定义显示日期格子内容(dayNumber, fullDate, dayStatus) => ReactNode-
rightSlot渲染右侧额外区域ReactNode2.65.0
showClear是否显示清除按钮booleantrue
size尺寸,可选值:"small", "default", "large"string'default'
spacing浮层与 trigger 的距离number4
startDateOffsettype 为 dateRange 时,设置单击选择范围的开始日期
(selectedDate) => Date
-
startYear滚轮的开始年number当前年前 100 年2.36.0
endYear滚轮的结束年,结束年需要大于开始年number当前年后 100 年2.36.0
stopPropagation是否阻止弹出层上的点击事件冒泡booleantrue
style自定义样式CSSProperties
syncSwitchMonth在范围选择的场景中,支持同步切换双面板的月份booleanfalse
timePickerOpts其他可以透传给时间选择器的参数,详见 TimePicker·API 参考object
topSlot渲染顶部额外区域ReactNode
triggerRender自定义触发器渲染方法,第一个参数是个 Object,详情看下方类型定义(props) => ReactNode
type类型,可选值:"date", "dateRange", "dateTime", "dateTimeRange", "month", "monthRange"string'date'
validateStatus校验状态,可选值 default、error、warning,默认 default。仅影响展示样式string
value受控的值ValueType
weekStartsOn以周几作为每周第一天,0 代表周日,1 代表周一,以此类推number0
zIndex弹出面板的 zIndexnumber1030
onBlur失去焦点时的回调,范围选择时不推荐使用(e: event) => void() => {}
onCancel取消选择时的回调,入参为上次确认选择的值,仅 type="dateTime"|"dateTimeRange" 且 needConfirm=true 时有效。
0.x版本入参顺序与新版有所不同
(date, dateString) => void
onChange值变化时的回调。
0.x版本入参顺序与新版有所不同
(date, dateString) => void
onChangeWithDateFirst0.x 中 onChange(string, Date), 1.0 后(Date, string)。此开关设为 false 时,入参顺序将与 0.x 版本保持一致booleantrue
onClear点击 clear 按钮时触发(e: event) => void() => {}
onClickOutSide当弹出层处于展示状态,点击非弹出层、触发器的回调, event 参数自 2.68.0 支持(event: React.mouseEvent) => void() => {}2.31.0
onConfirm确认选择时的回调,入参为当前选择的值,仅 type="dateTime"|"dateTimeRange" 且 needConfirm=true 时有效。
0.x版本入参顺序与新版有所不同
(date, dateString) => void
onFocus获得焦点时的回调,范围选择时不推荐使用(e: event) => void() => {}
onOpenChange面板显示或隐藏状态切换的回调
(isOpen) => void
onPanelChange切换面板的年份或者日期时的回调
(date, dateStr) => void
function
onPresetClick点击快捷选择按钮的回调
(item, e) => void
() => {}
yearAndMonthOpts其他可以透传给年月选择器的参数,详见 ScrollList#APIobject2.20.0

Methods

方法说明类型版本
open调用时可以手动展开下拉列表() => void2.31.0
close调用时可以手动关闭下拉列表() => void2.31.0
focus调用时可以手动聚焦输入框(focusType?: 'rangeStart' | 'rangeEnd') => void2.31.0
blur调用时可以手动失焦输入框() => void2.31.0

类型定义

Accessibility

ARIA

  • 未选中日期时,触发器的 aria-label 为 Choose date,选中日期时,触发器的 aria-label 为 Change date
  • 日期面板中月的 role 为 grid,周的 role 设置为 row,日期格子设置为 gridcell
  • 日期和时间禁用时对应选项的 aria-disabled 为 true
  • 多选时,月的 aria-multiselectable 为 true,选中时日期格子的 aria-selected 为 true
  • 面板中一些装饰作用的 icon,它们的 aria-hidden 为 true

文案规范

  • 日期选择器建议搭配标签使用
  • 使用简洁的标签来表明日期选择所指的内容
  • 日期选择器中日期格式请参考日期与时间的规范

设计变量

日期时间格式

semi-ui 组件库中采用 date-fns(v2.9.0) 作为日期时间引擎,格式化 token 含义如下:
  • "y" :年
  • "M" :月
  • "d" :日
  • "H" :小时
  • "m" :分钟
  • "s" :秒
下面以 new Date('2023-12-09 08:08:00') 和 [new Date('2023-12-09 08:08:00'), new Date('2023-12-10 10:08:00')] 为例说明不同 format 值对展示值的影响:
类型format展示值
dateyyyy-MM-dd2023-12-09
dateTimeyyyy-MM-dd HH:mm:ss2023-12-09 08:08:00
monthyyyy-MM2023-12
dateRangeyyyy-MM-dd2023-12-09 ~ 2023-12-10
dateTimeRangeyyyy-MM-dd HH:mm:ss2023-12-09 08:08 ~ 2023-12-10 10:08
多个日期或时间默认使用 "," (英文逗号)分隔。
更多 token 可以查阅 date-fns 官网

FAQ

  • 日期时间选择器,时分秒选择时想要无限滚动效果如何实现?
    版本V2.22.0开始,我们将 TimePicker 内的 ScrollItem 的默认模式从 wheel 变更为了 normal, 若想应用回无限滚动的效果,可以通过 timePickerOpts 中的特定开关控制该行为,即 timePickerOpts={{ scrollItemProps: { mode: "wheel", cycled: true } }}。
  • 如何设置面板打开时默认显示的时间?
    可通过 defaultPickerValue 属性。
  • 日期时间选择、范围日期选择,输入部分日期后,面板没有回显日期?
    输入框需要输入完整后才会回显到面板上。比如,日期时间选择,完整要求日期和时间都已输入。范围日期选择,完整要求开始日期和结束日期都已输入。
  • 日期时间选择面板底部的展示的时间是什么?
    未选择时间时,它为 defaultPickerValue 中时间的值,如果没有设置则是面板打开时的时间。选择时间后,它为已选择的时间。
    由于设计上它有隐含两层含义,可能会导致歧义,建议使用内嵌样式,通过 insetInput 打开。使用前推荐阅读相关 文档。