A partir do
PHP 5.2.0, há uma maneira nativa e simples de se trabalhar com horários e datas, com auxílio da
classe DateTime 
.
O objetivo do artigo é mostrar algumas das utilidades da classe
DateTime.
Sumário
1. Construtor da classe
2. Formatando datas
3. Adicionando períodos a datas
4. Subtraindo períodos de uma data
5. Calculando diferença entre datas
6. Modificando a data e a hora do objeto
Sintaxe do construtor:
DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
O método aceita dois parâmetros, ambos opcionais. O primeiro é a
data/hora, no mesmo formato aceito pela função
strftime() 
. O segundo consiste no
timezone que deve ser utilizado. Ele deve ser uma instância da classe
DateTimeZone 
. Uma outra maneira de definir o
timezone é por meio da função
date_default_timezone_set() 
.
Ambas as classes DateTime e DateTimeZone disparam uma exceção se seus construtores receberem parâmetro inválidos. Logo, podemos usar blocos try/catch para instanciar essas classes.
try
{
$DateTime = new DateTime( 'now', new DateTimeZone( 'America/Sao_Paulo') );
}
catch( Exception $e )
{
echo 'Erro ao instanciar objeto.
';
echo $e->getMessage();
exit();
}
Experimente trocar o "now" por um valor não aceito pelo método, como uma string qualquer. Uma exceção será disparada.
Para formatar datas, utilizamos o método
format, que aceita um parâmetro, correspondente a uma formatação de data aceita pela função
date() 
.
$DateTime = new DateTime();
echo $DateTime->format( "d/m/Y H:i:s" ) . '
';
echo $DateTime->format( "Y-m-d H:i:s" ) . '
';
echo $DateTime->format( "Y/m/d H:i:s" ) . '
';
Com o método
add(), podemos adicionar períodos à data salva no objeto
DateTime. É possível adicionar períodos de dias, períodos de tempo ou ambos, seguindo a formatação aceita pelo método, que recebe um único parâmetro, o qual é uma instância da classe
DateInterval 
, responsável por manipular os dados do período especificado.
Os períodos são especificados da seguinte maneira: períodos de dias são precedidos pela letra "P", seguidas de inteiros e seus respectivos identificadores de tempo ("D" para dias, "M" para meses e "Y" para anos). Períodos de tempo são precedidos pela letra "T" e seguidos de inteiros e seus respectivos identificadores de unidade ("H" para horas, "M" para minutos e "S" para segundos).
$DateTime = new DateTime();
$DateTime->add( new DateInterval( "P30D" ) ); // adiciona 30 dias
echo $DateTime->format( "d/m/Y" ) . '
';
$DateTime->add( new DateInterval( "P2M" ) ); // adiciona 2 meses
echo $DateTime->format( "d/m/Y" ) . '
';
$DateTime->add( new DateInterval( "P5Y" ) ); // adiciona 5 anos
echo $DateTime->format( "d/m/Y" ) . '
';
$DateTime->add( new DateInterval( "P5Y2M30D" ) ); // adiciona 30 dias, 2 meses e 5 anos
echo $DateTime->format( "d/m/Y" ) . '
';
Note que cada adição é feita com base na adição anterior, uma vez que cada soma modifica a data armazenada no objeto.
O método sub funciona da mesma forma que o add, com a mesma lista de parâmetros, mas, logicamente, em vez de adicionar períodos, ele os subtrai.
$DateTime = new DateTime();
$DateTime->sub( new DateInterval( "P30D" ) ); // subtrai 30 dias
echo $DateTime->format( "d/m/Y" ) . '
';
$DateTime->sub( new DateInterval( "P2M" ) ); // subtrai 2 meses
echo $DateTime->format( "d/m/Y" ) . '
';
$DateTime->sub( new DateInterval( "P5Y" ) ); // subtrai 5 anos
echo $DateTime->format( "d/m/Y" ) . '
';
$DateTime->sub( new DateInterval( "P5Y2M30D" ) ); // subtrai 30 dias, 2 meses e 5 anos
echo $DateTime->format( "d/m/Y" ) . '
';
Usando o método diff, podemos calcular o intervalo entre duas datas, com precisão de dias, meses, anos, horas, minutos e segundos. Esse método retorna uma instância da classe DateInterval, já citada anteriormente neste artigo.
$DateTime = new DateTime();
$diff = $DateTime->diff( new DateTime( '2009-02-14' ) );
echo "Diferença de:
" . $diff->d . " dias
" . $diff->m . " meses
" . $diff->y . " anos
" . $diff->h . " horas
" . $diff->i . " minutos
" . $diff->s . " segundos
";
Para modificar a data e a hora armazenadas no objeto, utilizamos os métodos setDate esetTime.
$DateTime = new DateTime();
echo $DateTime->format( "d/m/Y H:i" ) . '
';
$DateTime->setDate( 2007, 07, 07 );
$DateTime->setTime( 07, 27 );
echo $DateTime->format( "d/m/Y H:i" ) . '
';
Estou reproduzindo pois achei o artigo muito util e assim eu também não perco ele por ai! Todos os créditos ao escritor pelo otimo artigo.