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.)