Nuevo en Symfony 4.3: Mejoras relacionadas con las zonas horarias

Symfony 4.3 incluye un nuevo validador de zonas horarias que comprueba que el valor pasado es uno de los identificadores válidos para zonas horarias definidos por PHP. Además de ese validador, Symfony 4.3 incluirá muchas otras novedades importantes relacionadas con las zonas horarias.

Soporte para traducir zonas horarias

El componente Intl ha añadido una nueva clase Timezone con la que puedes traducir los nombres de todas las zonas horarias a todos los idiomas del mundo:

use Symfony\Component\Intl\Timezones;
 
// esto no hace falta hacerlo cuando usas este componente dentro de una
// aplicación Symfony completa (el "locale" se establece automáticamente)
\Locale::setDefault('en');
 
$timezones = Timezones::getNames();
// ('timezoneID' => 'timezoneValue')
// => ['America/Eirunepe' => 'Acre Time (Eirunepe)', 'America/Rio_Branco' => 'Acre Time (Rio Branco)', ...]
 
$timezones = Timezones::getNames('de');
// => ['America/Eirunepe' => 'Acre-Zeit (Eirunepe)', 'America/Rio_Branco' => 'Acre-Zeit (Rio Branco)', ...]
 
$timezone = Timezones::getName('Africa/Nairobi');
// => 'East Africa Time (Nairobi)'
 
$timezone = Timezones::getName('Africa/Nairobi', 'de');
// => 'Ostafrikanische Zeit (Nairobi)'

También puedes comprobar si una zona horaria existe:

$isValidTimezone = Timezones::exists($timezoneId);

También puedes obtener la diferencia horaria de cualquier zona horaria:

$offset = Timezones::getRawOffset('Etc/UTC');              // $offset = 0
$offset = Timezones::getRawOffset('America/Buenos_Aires'); // $offset = -10800
$offset = Timezones::getRawOffset('Asia/Katmandu');        // $offset = 20700
 
$offset = Timezones::getGmtOffset('Etc/UTC');              // $offset = 'GMT+00:00'
$offset = Timezones::getGmtOffset('America/Buenos_Aires'); // $offset = 'GMT-03:00'
$offset = Timezones::getGmtOffset('Asia/Katmandu');        // $offset = 'GMT+05:45'

Debido al horario de verano la diferencia horaria de algunos países depende del día, así que puedes pasar un segundo argumento a getRawOffset() y getGmtOffset() para obtener la diferencia horaria en ese punto del tiempo:

// En 2019, el horario de verano de Madrid empieza el 31 de marzo y acaba el 27 de octubre
Timezones::getRawOffset('Europe/Madrid', strtotime('March 31, 2019'));   // $offset = 3600
Timezones::getRawOffset('Europe/Madrid', strtotime('April 1, 2019'));    // $offset = 7200
Timezones::getGmtOffset('Europe/Madrid', strtotime('October 27, 2019')); // $offset = 'GMT+02:00'
Timezones::getGmtOffset('Europe/Madrid', strtotime('October 28, 2019')); // $offset = 'GMT+01:00'

Zonas horarias en TimezoneType

El campo de formulario TimezoneType soporta tanto cadenas de texto como zonas horarias de PHP en su opción input (que define el formato con el que se guarda la zona horaria en el objeto). En Symfony 4.3 hemos añadido un nuevo formato llamado intltimezone que usa objetos de tipo \IntlTimezone para almacenar esa información.

Nuevas zonas horarias en el validador

El validador Timezone también se ha actualizado para que soporte las nuevas zonas horarias de Intl y no solo las de PHP.

Traducción de los nombres de las zonas horarias

Esta funcionalidad tan deseada por toda la comunidad Symfony por fin se hará una realidad en Symfony 4.3: la lista de zonas horarias del campo de formulario TimezoneType ahora se puede traducir. Gracias a la nueva opción choice_translation_locale, solo tienes que indicar el "locale" en el que quieres mostrar las zonas horarias:

use Symfony\Component\Form\Extension\Core\Type\TimezoneType;
// ...
 
$builder->add('timezone', TimezoneType::class, [
    // ...
    'choice_translation_locale' => 'uk',
    'intl' => true,
]);

En este ejemplo, el locale uk se refiere al idioma ucraniano, por lo que en vez de ver zonas horarias en inglés como Central European Time (Amsterdam), el usuario verá cosas como за центральноєвропейським часом (Амстердам).

Esta funcionalidad fue contribuida por Roland Franssen en los pull requests #28831, #31295, #31262, #31195, #31318, #31292, #31294.

Fuente: New in Symfony 4.3: Timezone improvements

Comentarios

Publicada el

25 de junio de 2019

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.