0

PHP DateTime & Locale

criado por Marcel em 28/08/2015 2:11pm
O objeto nativo do PHP DateTime não suporta internacionalização, ou seja, quando se executa o método $dateTime->format(), não existe uma maneira de se trazer o formato do idioma definido no servidor, feito no PHP com a função nativa setLocale.

Quando é necessária a internacionalização de datas uma alternativa é utilizar a função nativa do PHP strftime, a qual recebe como parametros o formato e o timestamp. Para substituir o format do DateTime, mais uma coisa deve ser levada em consideração: a sintaxe da string do formato é diferente. O format do DateTime utiliza a sintaxe definida pelo objeto nativo do PHP Date, já o strftime utiliza a sintaxedefinida no padrão UNIX.

Lembrando que para o setlocale funcionar, o servidor onde o PHP está instalado, deve ter esse idioma configurado.

Para consultar os idiomas em um servidor de sistema operacional base UNIX execute o comando no terminal:
$ locale -a
Caso você queira configurar um idioma que não esteja na lista como por exemplo "pt_BR" execute a seguinte comando no terminal:
$ sudo locale-gen ru_pt_BR
Tendo o idioma configurado, você pode executar a função setlocale no PHP, sendo que o primeiro parâmetro é a categoria, que no nosso caso pode ser LC_ALL ou LC_TIME, e o segundo parâmetro o idioma que no nosso caso é "pt_BR".

Concluindo, o DateTime não tem a capacidade de formatar com internacionalização mas é possível utilizar outros recursos do PHP e se for o caso, criar uma classe que substitua o DateTime. Essa classe pode herdar a classe DateTime e sobrescrever os métodos de maneira adequada. Ou essa classe pode apenas ter como atributo um objeto do tipo DateTime e implementar os métodos que forem necessários. Segue abaixo um exemplo do segundo caso:
<?php
namespace Date;

class Date
{
   
private $dateTime;

   
public function __construct($time = null, $object = null, $format = null, $timestamp = null)
   
{
       
if ($time === null &amp;&amp; $object === null &amp;&amp; $format &amp;&amp; $timestamp) {
            $dateTime
= \DateTime::createFromFormat($format, $timestamp);
           
if ($dateTime instanceof \DateTime) {
                $this
->dateTime = new \DateTime($time, $object);
                $this
->dateTime->setTimestamp($dateTime->getTimestamp());
           
}
       
} else {
            $this
->dateTime = new \DateTime($time, $object);
       
}
   
}

   
public function format($format, $locale = false)
   
{
       
if ($locale) {
            setlocale
(LC_TIME, $locale);
           
return strftime($format, $this->dateTime->getTimestamp());
       
}

       
return $this->dateTime->format($format);
   
}

   
public function getTimestamp()
   
{
       
return $this->dateTime->getTimestamp();
   
}

   
public function setTimestamp($param)
   
{
        $this
->dateTime->setTimestamp($param);
   
}

   
public function getDateTime()
   
{
       
return $this->dateTime;
   
}
}

Comentários:

Nenhum comentário foi enviado ainda.

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)