Product Craft Bible
Date & Time Picker
Inicio Formularios e Inputs Date & Time Picker
Formularios e Inputs

Date & Time Picker

8 reglas GOV.UK Design System · Date input · Smashing Magazine "Frustrating Design Patterns: Birthday Picker" (Adam Silver, 2021)Material Design 3 · Date pickers · WCAG 2.2 SC 2.5.8 Target Size (Minimum) · WCAG 2.1 SC 2.5.5 Target Size (Enhanced)WAI-ARIA APG · Date Picker Dialog Example (w3.org/WAI/ARIA/apg)Shopify Polaris · Date picker (allowRange) · WCAG 2.2 SC 2.5.8 / WCAG 2.1 SC 2.5.5 Target Size
44

Date & Time Picker

8 reglas
411

Input segmentado para fechas memorables; calendario solo para fechas relativas al contexto

Cuando el usuario ya conoce la fecha (cumpleaños, fecha de nacimiento, vencimiento de un documento), forzarle un calendario lo obliga a navegar mes a mes con decenas de clics innecesarios. Un input de tres campos día / mes / año, con label visible encima de cada campo, se alinea con el modelo mental de quien recuerda una fecha como una cadena de dígitos. GOV.UK reserva su componente de date input para fechas que el usuario "ya sabe o puede buscar sin usar un calendario", y desaconseja el calendario cuando es improbable que el usuario conozca la fecha exacta. El calendario aporta valor solo cuando la fecha importa en relación a otras: disponibilidad, temporadas, día de la semana.

GOV.UK Design System · Date input · Smashing Magazine "Frustrating Design Patterns: Birthday Picker" (Adam Silver, 2021)
Preferir
Fecha de nacimiento
Día
Mes
Año
Tres campos, labels visibles, sin auto-tab.
3 toques de teclado · sin abrir calendario
Evitar
Fecha de nacimiento
Selecciona una fecha
< Junio 2026 >
28
29
30
1
2
3
4
5
6
7
8
9
10
11
~36 años atrás · decenas de clics de navegación
412

En móvil prefiere el picker nativo del sistema operativo sobre implementaciones custom

Los pickers nativos de iOS y Android están optimizados para cada plataforma: haptics, scroll de inercia, accesibilidad del sistema y entrada manual de texto sin abrir el selector. Reimplementar uno custom duplica el esfuerzo y casi siempre degrada la experiencia. Material 3 recomienda que en móvil el usuario pueda ingresar fechas tecleando, sin obligarlo al picker. WCAG 2.5.8 (AA) exime explícitamente a los inputs de calendario dimensionados por el navegador, salvo que el autor modifique sus dimensiones por defecto. Si la marca exige colores o tipografía propios, envuelve el trigger nativo en un botón custom, pero nunca reemplaces la lógica interna de selección.

Material Design 3 · Date pickers · WCAG 2.2 SC 2.5.8 Target Size (Minimum) · WCAG 2.1 SC 2.5.5 Target Size (Enhanced)
Preferir
iOS / Android
17 jun 2026
15 jun
16 jun
17 jun
18 jun
19 jun
El botón usa colores y tipografía de marca; al tocarlo se abre el sheet nativo con su scroll de inercia, haptics y accesibilidad del sistema. La lógica de selección no se reescribe.
413

Implementa la navegación de teclado completa del patrón APG Date Picker Dialog

El patrón oficial WAI-ARIA APG define un conjunto exacto de teclas para el grid del calendario; omitir cualquiera lo hace inaccesible para teclado y lectores de pantalla. Las flechas mueven día y semana, Home/End van al inicio/fin de la semana, Page Up/Down cambian de mes y con Shift de año, y Escape cierra devolviendo el foco al trigger. El grid usa role="grid" con roving tabindex (0 en la celda activa, -1 en el resto) y aria-selected; el heading mes/año usa aria-live="polite" para anunciar los cambios. Al abrir sin valor previo, el foco cae en la fecha actual del sistema; si hay un valor válido, cae en esa fecha.

WAI-ARIA APG · Date Picker Dialog Example (w3.org/WAI/ARIA/apg)
Preferir
<
Junio 2026
>
L
M
M
J
V
S
D
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
← → ↑ ↓ Día / semana
Home / End Inicio / fin de semana
Page Up/Dn Mes anterior / siguiente
⇧ Page Up/Dn Año anterior / siguiente
Enter / Esc Seleccionar / cerrar
414

Range picker: dos meses en desktop, uno en móvil; valida inicio-fin en tiempo real

El doble panel de calendario es el patrón estándar en desktop para seleccionar rangos porque permite ver inicio y fin sin cambiar de mes; en móvil un solo panel con navegación de flechas es preferible al panel doble comprimido. Mientras el usuario mueve el cursor tras elegir el inicio, muestra un preview del rango potencial para confirmar visualmente antes del clic. Previene selecciones de fin-antes-de-inicio automáticamente: reasigna el inicio o muestra error inmediato, nunca esperando al submit. Las celdas de día en un picker custom deben respetar un objetivo táctil adecuado (WCAG 2.5.8 exige ≥ 24×24 CSS px en AA; WCAG 2.5.5 eleva a ≥ 44×44 px en AAA).

Shopify Polaris · Date picker (allowRange) · WCAG 2.2 SC 2.5.8 / WCAG 2.1 SC 2.5.5 Target Size
Preferir
<Junio 2026
L
M
M
J
V
S
D
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Julio 2026>
L
M
M
J
V
S
D
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
10 jun – 17 jun, 2026 · preview de 18-20 al hover
415

Time picker con entrada de teclado; respeta 12h/24h regional y selecciona todo al enfocar

Los selectores de hora tipo "drum roll" son lentos e imprecisos; el input directo de teclado con validación en tiempo real es más rápido para horas conocidas. Material 3 ofrece dos variantes oficiales, Dial (reloj analógico interactivo) e Input (campos de texto directo), y recomienda permitir ambas. Detecta el locale para mostrar 12h (AM/PM) o 24h por defecto, y ofrece un toggle visible para cambiar entre modos. En los inputs, acepta entradas abreviadas como "9" (9:00), "930" (9:30) o "1430" (14:30) para reducir fricción, y al hacer clic en el campo de horas o minutos selecciona todo el contenido para reemplazo inmediato sin borrar primero. El paso de minutos debe ajustarse al dominio (citas, reservas, timers).

Material Design 3 · Time pickers (Dial / Input variants)
Preferir
Seleccionar hora 12h24h
09
:
30
AM
PM
El campo de horas está enfocado con todo el contenido seleccionado: teclear lo reemplaza. Acepta 9 → 9:00, 930 → 9:30, 1430 → 14:30.
416

Atajos de fecha relativa visibles junto al picker en dashboards y filtros de analítica

En analítica y reportes los usuarios razonan en rangos relativos ("últimos 7 días", "este mes"), no en fechas absolutas; ofrecer estos atajos junto al picker elimina el paso de calcular fechas a mano. Los atajos deben estar visibles sin abrir el calendario, en una lista lateral o un row de chips, nunca escondidos dentro del grid. Al seleccionar uno, muestra la fecha absoluta resultante en el campo o en un tooltip para confirmar el rango exacto, y distingue visualmente el atajo activo (color de acento, peso) para que el usuario sepa qué modo está aplicado. En móvil los atajos funcionan bien como chips horizontales scrolleables sobre el picker.

Shopify Polaris · Date picker (hoy como posición por defecto)
Preferir
Hoy
Ayer
Últimos 7 días
Este mes
Mes anterior
Personalizado
11 jun – 17 jun, 2026
L
M
M
J
V
S
D
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
417

Valida el input manual al perder el foco, no mientras escribe; muestra el formato como hint permanente

La validación prematura mientras el usuario escribe interrumpe el flujo y genera errores falsos; valida al blur de cada campo. El formato esperado debe ser texto permanente bajo el campo, nunca solo placeholder, porque los placeholders desaparecen al escribir y dejan al usuario sin referencia. GOV.UK acepta nombres de mes completos o abreviados ("january" o "jan") porque sus datos mostraron que muchos usuarios escriben el mes como nombre, y tras aceptar ambos formatos las tasas de error bajaron; además nunca aplica auto-tab entre campos. Los mensajes deben ser específicos ("El mes debe estar entre 1 y 12", "Febrero no tiene 31 días") y referenciar el campo exacto. Los campos de fecha de nacimiento deben declarar bday-day, bday-month, bday-year para cumplir WCAG 2.2 SC 1.3.5 (Identify Input Purpose).

GOV.UK Design System · Date input (no auto-tab, nombres de mes) · WCAG 2.2 SC 1.3.5 Identify Input Purpose
Preferir
Por ejemplo, 15 03 2026 · acepta "mar" o "marzo"
Febrero no tiene 31 días
Evitar
Fecha inválida
El formato solo aparecía como placeholder y desapareció al teclear.
418

Usa la locale del usuario para orden de fecha, primer día de semana y 12h/24h; nunca asumas MM/DD/YYYY

El orden de la fecha varía por región y mostrar el incorrecto provoca errores críticos (confundir el día 03 con el mes 03). Usa Intl.DateTimeFormat o el equivalente del framework para formatear según el locale detectado (navigator.language o preferencia de cuenta); nunca hardcodees el formato. El primer día de semana también cambia: lunes en Europa, Asia y según ISO 8601; domingo en Estados Unidos y Canadá; sábado en partes de Medio Oriente y Norte de África. ISO 8601 define YYYY-MM-DD como formato de intercambio para APIs y bases de datos, con lunes = 1 y domingo = 7. Muestra el hint de formato en la locale local ("DD/MM/YYYY" en México, "MM/DD/YYYY" en EE. UU., "YYYY年MM月DD日" en Japón) y acompaña siempre la hora de su zona horaria cuando el evento cruza zonas.

ISO 8601 · YYYY-MM-DD, lunes=1 · POEditor "Date & Time Localization" (primer día por región) · Shopify Polaris (weekStartsOn 0–6)
Preferir
es-MXen-USja-JP
es-MX
LMMJVSD
17/06/2026
DD/MM/YYYY · semana inicia lunes · 24h
en-US
SMTWTFS
06/17/2026
MM/DD/YYYY · semana inicia domingo · 12h
ja-JP
2026年06月17日
YYYY年MM月DD日 · Intl.DateTimeFormat