Cómo usar patrones para dar formato a fechas y horas (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows Runtime. Si estás desarrollando para Windows 10, consulta la documentación más reciente ]

Usa la API Windows.Globalization.DateTimeFormatting con patrones personalizados para mostrar fechas y horas en el formato exacto que quieras.

Windows.Globalization.DateTimeFormatting proporciona varias maneras de dar el formato adecuado a fechas y horas para los idiomas y las regiones de todo el mundo. En la mayoría de los casos, puedes usar formatos estándares para el año, el mes, el día, etc. O puedes usar plantillas de cadena estándares, como "longdate" o "month day", para asegurarte de que el formato resultante DateTime sea apropiado para la cultura, el idioma y la región del usuario. No obstante, en algunos casos, probablemente quieras tener más control sobre el orden y el formato de los constituyentes de la cadena DateTime que quieres mostrar. Esto puede deberse a que estás apuntando a una región o cultura conocida en particular, o porque quieres mostrar los constituyentes en un formato no estándar.

Para este fin, puedes usar una sintaxis especial para el parámetro de plantilla de cadena, llamada "patrón". La sintaxis de patrón te permite obtener los elementos individuales que componen un objeto DateTime (solo el nombre del mes o el valor del año, por ejemplo) para mostrarlos en el formato personalizado que desees.

Lo que debes saber

Tecnologías

Requisitos previos

Es importante tener en cuenta que, al usar patrones, lo que haces es compilar un formato personalizado que tal vez no sea válido en otras referencias culturales. Por ejemplo, considera la plantilla "month day":

var datefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");

Esto crea un formateador basado en el valor de región e idioma del contexto actual. Por lo tanto, siempre muestra el mes y el día junto con un formato global apropiado. Por ejemplo, muestra "January 1" para inglés (Estados Unidos), pero "1 janvier" para francés (Francia) y "1月1日" para japonés. Esto sucede porque la plantilla está basada en una cadena de patrón específica de una referencia cultural, a la que se puede acceder mediante la propiedad de patrón:

var monthdaypattern = datefmt.patterns;

Esto genera resultados diferentes en función del idioma y la región del formateador. Ten en cuenta que es posible que las diferentes regiones usen distintos elementos y con un orden distinto, con o sin caracteres y espaciado adicionales:

En-US: "{month.full} {day.integer}"
Fr-FR: "{day.integer} {month.full}"
Ja-JP: "{month.integer}月{day.integer}日"

Puedes usar patrones para crear un DateTimeFormatter personalizado, como este, que está basado en el patrón de idioma inglés de los Estados Unidos:

var datefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("{month.full} {day.integer}");

Windows devuelve valores específicos de una referencia cultural para cada elemento dentro de los corchetes {}. Pero con la sintaxis de patrón, el orden de los constituyentes no varía. Obtienes exactamente lo que pides, que puede no ser culturalmente apropiado:

En-US: January 1
Fr-FR: janvier 1 (inappropriate for France; non-standard order)
Ja-JP: 1月1 (inappropriate for Japan; the day symbol is missing)

Es más, no se garantiza que la coherencia de los patrones se mantenga con el tiempo. Los países o las regiones pueden cambiar sus sistemas de calendario, lo que modifica una plantilla de formato. Windows actualiza el resultado de los formateadores para tener en cuenta dichos cambios. Por eso, solo debes usar la sintaxis de patrón para dar formato a DateTime si:

  • No dependes de un resultado específico para un formato.
  • No necesitas que el formato cumpla con ningún estándar específico de una referencia cultural.
  • Específicamente intentas que el patrón no varíe de una cultura a otra.
  • Intentas localizar el patrón.

Este es un resumen de la diferencias entre las plantillas de cadena estándar y los patrones de cadena no estándar:

Plantillas de cadena, como “month day”:

  • Es una representación abstracta de un formato de DateTime que incluye valores para el mes y el día, en algún orden.
  • Garantiza que devuelve un formato estándar válido en todos los valores de idioma y región que admite Windows.
  • Garantiza que te proporcionará una cadena con un formato apropiado según la referencia cultural para el idioma o la región específicos.
  • No todas las combinaciones de elementos son válidas. Por ejemplo, no hay una plantilla de cadena para "dayofweek day".

Patrones de cadena, como “{month.full} {day.integer}”:

  • Es una cadena con un orden explícito que expresa el nombre del mes completo, seguido de un espacio y seguido de un número entero de día, en ese orden.
  • Es posible que no corresponda con un formato estándar válido para ningún par de idioma y región.
  • No garantiza que sea culturalmente apropiado.
  • Se puede especificar cualquier combinación de elementos, en cualquier orden.

Instrucciones

Supongamos que quieres mostrar el mes y el día actuales junto con la hora actual en un formato específico. Por ejemplo, quieres que los usuarios que hablan inglés de Estados Unidos vean algo así:

June 25 | 1:38 PM

La parte de fecha corresponde a la plantilla "month day" y la parte de hora corresponde a la plantilla "hour minute". Por lo tanto, puedes crear un formato personalizado que concatene los patrones que conforman esas plantillas.

Primero, obtén los formateadores pertinentes para las plantillas de fecha y hora y, después, los patrones de esas plantillas:

// Get formatters for the date part and the time part.
var dtf = Windows.Globalization.DateTimeFormatting;
var mydate = dtf.DateTimeFormatter("month day");
var mytime = dtf.DateTimeFormatter("hour minute");

// Get the patterns from these formatters.
var mydatepattern = mydate.patterns[0];
var mytimepattern = mytime.patterns[0];

Debes almacenar tu formato personalizado como una cadena de recursos localizable. Por ejemplo, la cadena para Inglés (Estados Unidos) sería "{date} | {time}". Los localizadores pueden ajustar esta cadena según la necesidad. Por ejemplo, pueden cambiar el orden de los constituyentes si parece más natural en algunos idiomas o regiones tener la hora delante de la fecha. O pueden reemplazar "|" con algún otro carácter separador. En tiempo de ejecución, reemplazas las partes {date} y {time} de la cadena con el patrón pertinente:

// Assemble the custom pattern. This string comes from a resource, and should be localizable. 
var mydateplustime = WinJS.Resources.getString("date_plus_time");
mydateplustime = mydateplustime.replace("{date}", mydatepattern);
mydateplustime = mydateplustime.replace("{time}", mytimepattern);

Después puedes generar un nuevo formateador en función del patrón personalizado:

// Get the custom formatter.
var mydateplustimefmt = new dtf.DateTimeFormatter(mydateplustime);

Temas relacionados

Muestra de formato de fecha y hora

Windows.Globalization.DateTimeFormatting

Windows.Foundation.DateTime