Saltar al contenido principal

MaskedDateField

Abrir en ChatGPT
Sombra dwc-datefield 24.10
Java API

El MaskedDateField es un campo de texto que permite a los usuarios ingresar fechas como números y formatea automáticamente la entrada según una máscara definida cuando el campo pierde el foco. La máscara especifica el formato de fecha esperado, guiando tanto la entrada como la visualización. El componente soporta análisis flexible, validación, localización y restauración de valores para un manejo coherente de fechas específicas de la región.

¿Buscas entrada de tiempo?

El MaskedDateField se centra exclusivamente en los valores de fecha. Si necesitas un componente similar para ingresar y formatear hora, consulta el MaskedTimeField en su lugar.

El MaskedDateField puede ser instanciado con o sin parámetros. Puedes definir un valor inicial, una etiqueta, un marcador de posición y un oyente de eventos para cambios de valor.

Mostrar Código

Reglas de máscara​

El MaskedDateField soporta múltiples formatos de fecha usados en todo el mundo, que varían por el orden de día, mes y año. Los patrones comunes incluyen:

  • Día/Mes/Año (usado en la mayor parte de Europa)
  • Mes/Día/Año (usado en los Estados Unidos)
  • Año/Mes/Día (usado en China, Japón y Corea; también el estándar ISO: YYYY-MM-DD)

Dentro de estos formatos, las variaciones locales incluyen la elección del separador (por ejemplo, -, / o .), si los años tienen dos o cuatro dígitos, y si los meses o días de un solo dígito se rellenan con ceros a la izquierda.

Para manejar esta diversidad, el MaskedDateField utiliza indicadores de formato, cada uno comenzando con %, seguido de una letra que representa una parte específica de la fecha. Estos indicadores definen cómo se analiza la entrada y cómo se muestra la fecha.

Aplicando máscaras programáticamente

Para formatear o analizar fechas con la misma sintaxis de máscara fuera de un campo, utiliza la clase de utilidad MaskDecorator.

Indicadores de formato de fecha​

FormatoDescripción
%YAño
%MMes
%DDía

Modificadores​

Los modificadores permiten un mayor control sobre cómo se formatean los componentes de la fecha:

ModificadorDescripción
zRelleno con ceros
sRepresentación de texto corto
lRepresentación de texto largo
pNúmero empaquetado
dDecimal (formato predeterminado)

Estos pueden combinarse para construir una amplia variedad de máscaras de fecha.

Localización del formato de fecha​

El MaskedDateField se adapta a los formatos de fecha regionales configurando la localidad apropiada. Esto asegura que las fechas se muestren y analicen de una manera que se ajuste a las expectativas del usuario.

RegiónFormatoEjemplo
Estados UnidosMM/DD/YYYY07/04/2023
EuropaDD/MM/YYYY04/07/2023
Estándar ISOYYYY-MM-DD2023-07-04

Para aplicar la localización, utiliza el método setLocale(). Acepta un java.util.Locale y ajusta automáticamente tanto el formateo como el análisis:

dateField.setLocale(Locale.FRANCE);

Lógica de análisis​

El MaskedDateField analiza la entrada del usuario basada en la máscara de fecha definida. Acepta entradas numéricas completas y abreviadas con o sin delimitadores, permitiendo una entrada flexible mientras asegura fechas válidas. El comportamiento de análisis depende del orden de formato definido por la máscara (por ejemplo, %Mz/%Dz/%Yz para mes/día/año). Este formato determina cómo se interpretan las secuencias numéricas.

Por ejemplo, asumiendo que hoy es 15 de septiembre de 2012, así es como se interpretarían varias entradas:

Escenarios de análisis de ejemplo​

EntradaYMD (ISO)MDY (EE. UU.)DMY (UE)
1
Un solo dígito siempre se interpreta como un número de día dentro del mes actual, por lo que esto sería el 1 de septiembre de 2012.Igual que YMDIgual que YMD
12
Dos dígitos siempre se interpretan como un número de día dentro del mes actual, por lo que esto sería el 12 de septiembre de 2012.Igual que YMDIgual que YMD
112
Tres dígitos se interpretan como un número de mes de 1 dígito seguido de un número de día de 2 dígitos, por lo que esto sería el 12 de enero de 2012.Igual que YMDTres dígitos se interpretan como un número de día de 1 dígito seguido por un número de mes de dos dígitos, por lo que esto sería el 1 de diciembre de 2012.
1004
Cuatro dígitos se interpretan como MMDD, por lo que esto sería el 4 de octubre de 2012.Igual que YMDCuatro dígitos se interpretan como DDMM, por lo que esto sería el 10 de abril de 2012.
020304
Seis dígitos se interpretan como YYMMDD, por lo que esto sería el 4 de marzo de 2002.Seis dígitos se interpretan como MMDDYY, por lo que esto sería el 3 de febrero de 2004.Seis dígitos se interpretan como DDMMYY, por lo que esto sería el 2 de marzo de 2004.
8 digits
Ocho dígitos se interpretan como YYYYMMDD. Por ejemplo, 20040612 es el 12 de junio de 2004.Ocho dígitos se interpretan como MMDDYYYY. Por ejemplo, 06122004 es el 12 de junio de 2004.Ocho dígitos se interpretan como DDMMYYYY. Por ejemplo, 06122004 es el 6 de diciembre de 2004.
12/6
Dos números separados por cualquier delimitador válido se interpretan como MM/DD, por lo que esto sería el 6 de diciembre de 2012.
Nota: Todos los caracteres que no sean letras y dígitos son considerados delimitadores válidos.
Igual que YMDDos números separados por cualquier delimitador se interpretan como DD/MM, por lo que esto sería el 12 de junio de 2012.
3/4/5
5 de abril de 20124 de marzo de 20053 de abril de 2005

Análisis de fechas textuales 25.11​

Por defecto, el MaskedDateField solo acepta entradas numéricas para fechas. Sin embargo, puedes habilitar el análisis de fechas textuales para permitir a los usuarios ingresar nombres de meses y días en su entrada. Esta función es particularmente útil para crear una entrada de fecha más natural.

Para habilitar el análisis textual, utiliza el método setTextualDateParsing():

dateField.setTextualDateParsing(true);

Sustitución de nombres de meses​

Cuando se habilita el análisis textual, puedes usar modificadores especiales en tu máscara para aceptar nombres de meses en lugar de valores numéricos:

  • %Ms - Acepta nombres de meses cortos (Ene, Feb, Mar, etc.)
  • %Ml - Acepta nombres de meses largos (Enero, Febrero, Marzo, etc.)

Los nombres de los meses pueden aparecer en cualquier posición dentro de la máscara, y el campo aún aceptará entradas numéricas como respaldo.

Ejemplos​

MáscaraEntradaResultado
%Ms/%Dz/%YzSep/01/25Válido - Se analiza como 1 de septiembre de 2025
%Ml/%Dz/%YzSeptiembre/01/25Válido - Se analiza como 1 de septiembre de 2025
%Dz/%Ml/%Yz01/Septiembre/25Válido - Se analiza como 1 de septiembre de 2025
%Mz/%Dz/%Yz09/01/25Válido - El respaldo numérico aún funciona
info

Se admiten los 12 meses en ambas formas cortas (Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic) y largas (Enero, Febrero, etc.).

Decoración del nombre del día​

Los nombres de los días de la semana pueden incluirse en la entrada para una mejor legibilidad, pero son decorativos únicamente y se eliminan durante el análisis. No afectan el valor real de la fecha.

  • %Ds - Acepta nombres de días cortos (Lun, Mar, Mié, etc.)
  • %Dl - Acepta nombres de días largos (Lunes, Martes, Miércoles, etc.)
Los nombres de días requieren un día numérico

Cuando se utilizan nombres de días de la semana (%Ds o %Dl), tu máscara también debe incluir %Dz o %Dd para especificar el número real del día. Sin un componente de día numérico, la entrada será inválida.

Ejemplos​

MáscaraEntradaResultado
%Ds %Mz/%Dz/%YzLun 09/01/25Válido - El nombre del día es decorativo
%Dl %Mz/%Dz/%YzLunes 09/01/25Válido - El nombre del día es decorativo
%Mz/%Dz/%Yz %Ds09/01/25 MarVálido - Nombre del día al final
%Dl/%Mz/%YzLunes/09/25Inválido - Falta %Dz
%Mz/%Dl/%Yz09/Lunes/25Inválido - Falta %Dz

Se admiten los 7 días de la semana en ambas formas cortas (Lun, Mar, Mié, Jue, Vie, Sáb, Dom) y largas (Lunes, Martes, etc.).

Reglas adicionales de análisis​

El análisis de fechas textuales incluye varias características útiles:

  • Sin distinción de mayúsculas: Entradas como LUNES 09/01/25, lunes 09/01/25 o Lunes 09/01/25 funcionan de la misma manera.
  • Conocimiento de la localidad: Los nombres de meses y días deben coincidir con la localidad configurada del campo. Por ejemplo, con una localidad francesa, usa septembre no September. Los nombres en inglés no serán reconocidos a menos que la localidad esté configurada en inglés.
    • Localidad francesa: septembre/01/25 es reconocido como septiembre
    • Localidad alemana: Montag 09/01/25 es reconocido con lunes como el nombre del día

Estableciendo restricciones mínimas/máximas​

Puedes restringir el rango de fechas permitidas en un MaskedDateField utilizando los métodos setMin() y setMax():

dateField.setMin(LocalDate.of(2020, 1, 1));
dateField.setMax(LocalDate.of(2030, 12, 31));

Ambos métodos aceptan valores del tipo java.time.LocalDate. Las entradas fuera del rango definido se considerarán inválidas.

Restaurando el valor​

El MaskedDateField incluye una función de restauración que restablece el valor del campo a un estado predefinido u original. Esto es útil para revertir la entrada del usuario o restablecer una fecha predeterminada.

dateField.setRestoreValue(LocalDate.of(2025, 1, 1));
dateField.restoreValue();

Formas de restaurar el valor​

  • De forma programática, llamando a restoreValue()
  • A través del teclado, presionando ESC (esta es la tecla de restauración predeterminada a menos que se anule mediante un oyente de eventos)

Puedes establecer el valor a restaurar con setRestoreValue(), pasando una instancia de LocalDate.

Mostrar Código

Patrones de validación​

Puedes aplicar reglas de validación del lado del cliente utilizando expresiones regulares con el método setPattern():

dateField.setPattern("^\\d{2}/\\d{2}/\\d{4}$");

Este patrón asegura que solo se consideren válidos los valores que coinciden con el formato MM/DD/YYYY (dos dígitos, barra, dos dígitos, barra, cuatro dígitos).

Formato de expresión regular

El patrón debe seguir la sintaxis de RegExp de JavaScript como se documenta aquí.

Notas sobre el manejo de entradas

El campo intenta analizar y formatear las entradas numéricas de fecha basándose en la máscara actual. Sin embargo, los usuarios aún pueden ingresar manualmente valores que no coincidan con el formato esperado. Si la entrada es sintácticamente válida pero semánticamente incorrecta o no se puede analizar (por ejemplo, 99/99/9999), puede pasar las verificaciones de patrón pero fallar la validación lógica. Siempre debes validar el valor de entrada en la lógica de tu aplicación, incluso si se establece un patrón de expresión regular, para asegurar que la fecha esté correctamente formateada y tenga sentido.

Selector de fecha​

El MaskedDateField incluye un selector de calendario integrado que permite a los usuarios seleccionar una fecha visualmente, en lugar de escribirla. Esto mejora la usabilidad para usuarios menos técnicos o cuando se requiere una entrada precisa.

Mostrar Código

Accediendo al selector​

Puedes acceder al selector de fecha utilizando getPicker():

DatePicker picker = dateField.getPicker();

Mostrar/ocultar el ícono del selector​

Utiliza setIconVisible() para mostrar u ocultar el ícono del calendario junto al campo:

picker.setIconVisible(true); // muestra el ícono

Comportamiento de apertura automática​

Puedes configurar el selector para que se abra automáticamente cuando el usuario interactúa con el campo (por ejemplo, hace clic, presiona Enter o las teclas de flecha):

picker.setAutoOpen(true);
Forzar selección a través del selector

Para asegurar que los usuarios solo puedan seleccionar una fecha utilizando el selector de calendario (y no escribir manualmente una), combina los siguientes dos ajustes:

dateField.getPicker().setAutoOpen(true); // Abre el selector en la interacción del usuario
dateField.setAllowCustomValue(false); // Desactiva la entrada de texto manual

Esta configuración garantiza que toda la entrada de fecha provenga a través de la interfaz del selector, lo cual es útil cuando quieres un control estricto sobre el formato y eliminar problemas de análisis de entradas tecleadas.

Abrir el calendario manualmente​

Para abrir el calendario programáticamente:

picker.open();

O utiliza el alias:

picker.show(); // igual que open()

Mostrar semanas en el calendario​

El selector puede mostrar opcionalmente los números de semana en la vista del calendario:

picker.setShowWeeks(true);

MaskedDateFieldSpinner​

El MaskedDateFieldSpinner extiende el MaskedDateField al agregar controles de spinner que permiten a los usuarios incrementar o decrementar la fecha utilizando las teclas de flecha o botones de la interfaz de usuario. Proporciona un estilo de interacción más guiado, especialmente útil en aplicaciones de estilo de escritorio.

Mostrar Código

Características clave​

  • Incremento de fecha interactivo: Utiliza las teclas de flecha o botones de giro para incrementar o decrementar el valor de la fecha.

  • Unidad de paso personalizable: Elige qué parte de la fecha modificar usando setSpinField():

    spinner.setSpinField(MaskedDateFieldSpinner.SpinField.MONTH);

    Las opciones incluyen DAY, WEEK, MONTH y YEAR.

  • Fronteras mínimas/máximas: Hereda soporte para fechas mínimas y máximas permitidas utilizando setMin() y setMax().

  • Salida formateada: Totalmente compatible con máscaras y configuraciones de localización de MaskedDateField.

Ejemplo: Configurar incremento semanal​

MaskedDateFieldSpinner spinner = new MaskedDateFieldSpinner();
spinner.setSpinField(MaskedDateFieldSpinner.SpinField.WEEK);

Esto hace que cada paso del giro avance o retroceda la fecha en una semana.

Estilo​

Loading...