Symfony 4.3: Aprimoramentos no Validador Timezone

O Symfony 4.3 irá adicionar um novo validador de fuso horário (Timezone) para verificar se o valor fornecido é um ID de timezone válido, conforme definido pelo PHP. Além desse validador, foi trabalhado em muitos outros recursos para melhorar o suporte a timezones.

Timezones adicionadas ao componente Intl

O componente Intl adicionou uma nova classe Timezone para obter informações sobre timezones, como seus nomes (em todos os idiomas):

use Symfony\Component\Intl\Timezones;

\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)'

Você também pode verificar se um determinado ID de timezone é válido:

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

Finalmente, você pode obter o deslocamento de timezone para qualquer timezone informada:

$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'

Timezones Intl em TimezoneType

O elemento de formulário TimezoneType suporta tanto strings quanto PHP timezones em sua opção input (que define o formato em que o fuso horário é armazenado em seu objeto subjacente). No Symfony 4.3 essa opção suporta um novo valor chamado intltimezone para usar objetos\IntlTimeZone para armazenar fusos horários.

Permitir timezones Intl no validador

O validador Timezone adicionado ao Symfony 4.3 foi melhorado para também considerar válidos ICU timezones, e não apenas PHP timezones. Além disso, a lista de ICU timezones foi atualizada para a versão 64.2. A única diferença é que fusos horários expirados não podem ser usados ​​com IntlTimeZone.

Na prática, isso considera válido tanto o UTC (o formato PHP) quanto o Etc/UTC (o formato ICU), enquanto o Etc/UTC era considerado errado antes (o que não é).

Tradução dos nomes de timezones

Esse recurso solicitado há muito tempo irá finalmente ser adicionado no Symfony 4.3: a lista de nomes de fuso horário exibidos pelo TimeZoneType pode ser traduzida. Graças à nova opção choice_translation_locale, você pode definir a localidade usada para traduzir os nomes de fuso horário antes de exibi-los ao usuário:

use Symfony\Component\Form\Extension\Core\Type\TimezoneType;
// ...

$builder->add('timezone', TimezoneType::class, [
// ...
'choice_translation_locale' => 'uk',
'intl' => true,
]);

No exemplo acima, os fusos horários serão exibidos em ucraniano (locale = uk) em vez do inglês padrão, para que o usuário veja за центральноєвропейським часом (Амстердам) em vez de Central European Time (Amsterdam).

Tradução de: New in Symfony 4.3: Timezone improvements