Time Range Field

Dates & Time
Local guide ↗ import { TimeRangeField } from "bits-ui"

Bound working hours

Start and end Time values move together while a derived duration stays in sync

Support coverage
8h 30m coverage

Cross-field validation

The complete range is rejected when its end is earlier than its start

Review session

End time must not be earlier than start time.

The bound value is { start, end }, where either side can be undefined during partial entry. Each TimeRangeField.Input therefore needs a required type so Bits UI can route its segments to the correct side; an Input name also produces that side's hidden form input.

Custom validation receives the completed range and may return a string or string array; errorMessageId associates explanatory text with the invalid field. Granularity defaults to minute, locale supplies segment order and clock preference, and hourCycle can force 12- or 24-hour output for both sides.