Skip to content

DateTimePicker

Anatomy

+----------------------------------------------------+
| Label |
| +------------------------------------------------+ |
| | MM / DD / YYYY · HH : MM 📅 | |
| +------------------------------------------------+ |
| Helper text |
+----------------------------------------------------+

Examples

Basic

<DateTimePicker label="Meeting time" />

Controlled

import { parseDate, Time, type DateValue, type TimeValue } from '@internationalized/date';
const [d, setD] = useState<DateValue | null>(parseDate('2026-05-26'));
const [t, setT] = useState<TimeValue | null>(new Time(14, 30));
<DateTimePicker
label="Send at"
value={d} onChange={setD}
time={t} onTimeChange={setT}
/>

When to use

  • Meeting / event scheduling.
  • Scheduled-publish forms (CMS, marketing).
  • Reservation start times.

When to reach for something else

  • Just a date. Use <DatePicker>.
  • A range of date-times. Use <DateRangePicker> + two <TimeField>s (a <DateTimeRangePicker> is on the roadmap).
  • Just a time, no date. Use a bare <TimeField> from react-aria-components; we’ll wrap it as <TimeField> in v0.2.

Install: @helixui/core

import { DateTimePicker } from '@helixui/core'

status: stable · since: 0.1.0

Tags: date, time, picker, calendar, schedule, appointment

Props

NameTypeDefaultDescription
labelstringundefinedField label rendered above the row.
descriptionstringundefinedHelper text rendered below the row.
errorMessagestringundefinedValidation message shown when invalid.
tone'brand' | 'neutral' | 'danger'brandTone for focus ring + selected day.
size'sm' | 'md' | 'lg'mdTouch target size.
valueDateValue | nullundefinedControlled date.
onChange(value: DateValue | null) => voidundefinedFires when the date changes.
timeTimeValueundefinedControlled time portion.
onTimeChange(value: TimeValue | null) => voidundefinedFires when the time changes.
defaultTimeTimeValueundefinedUncontrolled initial time.
timeStepnumber5Granularity of the minute field, in minutes.

Tokens used

color.bg.surface.default, color.bg.action.brand.default, color.border.subtle, color.border.action.brand, color.text.primary, color.text.muted, color.text.action.brand, radius.sm, radius.md, radius.lg, spacing.1, spacing.2, spacing.3

Accessibility

Role: combobox

Keyboard

KeyAction
TabMove between date segments, time segments, and the trigger.
ArrowUpIncrement focused segment.
ArrowDownDecrement focused segment.
EnterOpen the popover from the trigger; select a focused day in the grid.

Notes

  • Date and time fields are independently focusable.
  • Time field defaults to 24-hour; pass hourCycle={12} via wrapping for am/pm.
  • The popover calendar only affects the date; the time persists across day changes.