PHP DateTime & Locale

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 sintaxe definida 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 && $object === null && $format && $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;
    }
}
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s