跳到主要内容

TimePicker

  • 组件说明:时间选择组件,用于选择小时、分钟与可选的秒。API 参考 antd TimePickervalue / defaultValue / onChange / hourStep / minuteStep / disabledHours / showSecond)。
  • 尺寸基线:Trigger 高 32px,面板列宽 106px,列最大高 332px,单项高 38px,圆角 5px。
  • 实现约定:Trigger 复用 DatePicker 视觉规范;面板是多列可滚动列表,挂在 unstyledVisual 模式的 Popover 中;点击任一列即时提交变更,面板保持打开方便继续调整其他列。
  • TimePicker 面板 Figma 规范

基础用法

点击 Trigger 打开面板,点击任一列条目即时提交变更(可以继续调整其他列)。

结果
Loading...
实时编辑器
const Demo = () => {
  const [time, setTime] = useState(undefined)
  return (
    <div style={{ padding: '40px 0' }}>
      <TimePicker
        className="w-62"
        value={time}
        onChange={setTime}
        placeholder="选择时间"
      />
    </div>
  )
}
render(<Demo />)

状态

禁用

结果
Loading...
实时编辑器
const Demo = () => {
  return (
    <div style={{ display: 'flex', gap: 16, padding: '40px 0' }}>
      <TimePicker className="w-62" disabled placeholder="禁用(空)" />
      <TimePicker className="w-62" disabled value={new Date(2026, 3, 20, 10, 30)} />
    </div>
  )
}
render(<Demo />)

有值(可清除)

Hover Trigger 展示清除按钮。

结果
Loading...
实时编辑器
const Demo = () => {
  const [time, setTime] = useState(new Date(2026, 3, 20, 13, 30))
  return (
    <div style={{ padding: '40px 0' }}>
      <TimePicker
        className="w-62"
        value={time}
        onChange={setTime}
      />
    </div>
  )
}
render(<Demo />)

步长

minuteStep={5} 对齐 Figma 参考样式:分钟列展开为 00051055

结果
Loading...
实时编辑器
const Demo = () => {
  const [time, setTime] = useState(new Date(2026, 3, 20, 13, 0))
  return (
    <div style={{ padding: '40px 0' }}>
      <TimePicker
        className="w-62"
        value={time}
        onChange={setTime}
        minuteStep={5}
      />
    </div>
  )
}
render(<Demo />)

显示秒

打开 showSecond 渲染第三列。

结果
Loading...
实时编辑器
const Demo = () => {
  const [time, setTime] = useState(new Date(2026, 3, 20, 13, 30, 15))
  return (
    <div style={{ padding: '40px 0' }}>
      <TimePicker
        className="w-72"
        value={time}
        onChange={setTime}
        showSecond
      />
    </div>
  )
}
render(<Demo />)

禁用小时

通过 disabledHours 限制可选小时,对应项会变为不可交互。

结果
Loading...
实时编辑器
const Demo = () => {
  const [time, setTime] = useState(undefined)
  return (
    <div style={{ padding: '40px 0' }}>
      <TimePicker
        className="w-62"
        value={time}
        onChange={setTime}
        disabledHours={() => [0, 1, 2, 3, 4, 5, 6, 22, 23]}
        placeholder="仅工作时间"
      />
    </div>
  )
}
render(<Demo />)

自定义格式

结果
Loading...
实时编辑器
const Demo = () => {
  const [time, setTime] = useState(new Date(2026, 3, 20, 13, 5))
  const format = (d) => {
    const hh = d.getHours()
    const mm = String(d.getMinutes()).padStart(2, '0')
    const suffix = hh >= 12 ? 'PM' : 'AM'
    const h12 = ((hh + 11) % 12) + 1
    return `${h12}:${mm} ${suffix}`
  }
  return (
    <div style={{ padding: '40px 0' }}>
      <TimePicker
        className="w-62"
        value={time}
        onChange={setTime}
        formatTime={format}
      />
    </div>
  )
}
render(<Demo />)

Token 表

元素属性Token / 值
Trigger边框(默认)Separators/Emphasized#CCCCCC
Trigger边框(激活)Grays/Black#000000
Trigger底色Backgrounds/Primary#FFFFFF
Trigger(禁用)底色Grays/Gray-1#EBEBEB
值文本颜色Labels/Primary#000000
Placeholder颜色Labels/Tertiary#757575
单项文本颜色Labels/Secondary#3D3D3D
单项 hover底色Grays/Gray-1#EBEBEB
面板底色Grays/White#FFFFFF
面板投影Effects/Shadow/Defaultrgba(0,0,0,0.1)
Check 图标颜色Labels/Primary#000000

尺寸规范

维度
Trigger 高度32px
Trigger 内边距Spacing_16 / Spacing_12
Trigger 圆角Radius_5 (5px)
Trigger 字号Body/Regular (14px)
面板列宽106px
面板列最大高度332px(可滚动)
单项内边距Spacing_8 / Spacing_16
单项高度38px
Check 占位20×20px(选中 / 未选中无布局抖动)
Popover offset4px

Props

Prop类型默认说明
valueDate受控时间值
defaultValueDate非受控初始值
placeholderstring'Select time'Trigger placeholder 文本
formatTime(date: Date) => stringHH:mmshowSecond 时为 HH:mm:ss显示格式化函数
hourStepnumber1小时步长
minuteStepnumber1分钟步长
secondStepnumber1秒步长
showSecondbooleanfalse是否渲染秒列
disabledHours() => number[]禁用小时
disabledMinutes(hour: number) => number[]禁用分钟(基于当前小时)
disabledSeconds(hour: number, minute: number) => number[]禁用秒
disabledbooleanfalse禁用整体
allowClearbooleantruehover 时显示清除按钮
openboolean受控 open
defaultOpenbooleanfalse默认 open
onOpenChange(open: boolean) => voidopen 变更回调
onChange(date: Date | undefined) => void值变更回调
classNamestringTrigger 自定义 class

与 antd 的差异

  • value / onChange 使用原生 Date,不依赖 dayjs
  • 点击任一列即时提交变更,面板保持打开,便于继续调整其他列。
  • 暂未实现 use12HoursshowNow 与范围 TimePicker。

Changelog

2026-05-29 — 首次发布

新增组件:TimePicker(小时 + 分钟,可选秒)。支持 hourStep / minuteStep / secondStepdisabledHours / disabledMinutes / disabledSeconds、受控/非受控值、Trigger 可清除、受控 open、以及自定义时间格式。