Skip to content

Date Picker

A calendar control for selecting dates — the component most often used where a plain text input would serve better.

UI Components

A date picker is a calendar control for selecting a date. It is also the component most often reached for where a plain text input would do the job faster.

The question to ask before adding one: does the person already know the date?

When typing beats a calendar

A birth date. Somebody knows it. In a calendar they navigate back three hundred and some months to reach it, and the year dropdown that makes this bearable is the first thing dropped in a custom implementation.

An invoice date they are copying from a document. A contract date from an email.

In all of these, a text input with a format hint is faster, and the calendar is decoration that costs time.

When a calendar earns its place

The day of the week matters. Scheduling a recurring meeting, booking a delivery.

Proximity to today matters. "Two weeks from now" is a position on a grid, not a number somebody holds.

Availability matters. Booked days, blackout dates, minimum notice. This is the strongest case, because the constraint is only legible visually.

Always allow typing

Not as a fallback. As an equal path.

It is faster for anybody who knows the date, and it is the humane route for keyboard and screen reader users, who otherwise arrow through a grid of thirty-one cells.

Parse leniently. Accept 3/4/25, 2025-04-03, 3 Apr, April 3. Ambiguity between day-first and month-first is real, so echo back what you understood in full — "Friday, 3 April 2026" — and let somebody correct it before it silently becomes the wrong quarter.

Ranges

Different component, and usually the one actually needed in a B2B product.

Presets first. Last 7 days, last 30, this month, last month, this quarter, year to date. In analytics products these cover the large majority of selections, and putting the calendar first makes people work for the common case.

Two months side by side on desktop, so a range crossing a boundary is one view.

Say which end you are setting. A range picker where the second click ambiguously resets the start is the standard complaint about this component.

Time zones

A date chosen at 11pm in one zone is a different date in another. State the zone in the interface rather than assuming one, because a report that shifts by a day is a defect customers struggle to even describe.

Accessibility

A grid with arrow keys, page up and down for months, home and end for week boundaries.

Announce month and year changes, or somebody navigating by keyboard loses their place entirely.

Return focus to the trigger on close.

The text input counts. Most library pickers implement the grid correctly and treat the input as optional, which is the wrong half to skip.

In practice

A SaaS reporting page opens with a calendar defaulted to today, and every session starts with somebody navigating back to set a range.

The logs show that four ranges account for most of what people actually select. The calendar was serving a minority of cases and taxing everybody.

Presets in a row above the calendar, with "Last 30 days" as the default, removes the interaction from most sessions. The calendar stays for the rest, unchanged.

Nothing about the component improved. It stopped being the first thing in the way.

Where teams get it wrong

  • A calendar for a birth date. Three hundred months of navigation.
  • No typing. The fast path removed for everybody who knows the date.
  • Strict parsing. A valid date rejected because of a slash.
  • No echo. 3/4 silently becoming the wrong month.
  • A range picker with no presets. The common case made manual.
  • Assumed time zones. Reports off by a day, and no way to describe it.

Frequently Asked Questions