Como trabalhar com a classe DateTime do PHP e facilitar sua vida
Você já se viu tendo problemas com datas quanto está programando em PHP, antes tinhamos que fazer tudo com a função date() e isso era extremamente cansativo e as vezes dava errado. Pensando nisso que existe a classe DateTime do PHP5, essa classe trabalha de forma maravilhosamente bem com datas e horas, e você pode com poucas linhas resolver grandes problemas, sem precisar de fazer POG. POG: Programação orientada a gambiarras
Instanciando um objeto DateTime.
$data = new Datetime();
Por padrão, internamente ele irá vir com um parâmetro NOW, que irá gerar data e hora atual. Se você quiser fazer algo específico, você pode chamar assim (se você reparar, ele gera um DateTime com a hora vazia):
$data = new Datetime('2014-08-01');
Caso você queira comparar também o horário, você pode fazer isso:
$data = new Datetime('2014-08-01'.Date('Y-m-d'));
Data formatada padrão brasileiro pt-br
$data = new Datetime('2014-08-01');
echo $data->format('d/m/Y');
Alterar uma data de um objeto já instanciado
$data = new Datetime('2014-08-01'.Date('H:i:s'));
$data->modify('1 days')
Podemos utilizar days, weeks, months, years para alterar a data. O sinal negativo pode ser passado antes do número para retroceder a data.
$data = new Datetime('2014-08-01'.Date('H:i:s'));
$data->modify('-1 days')
Comparando datas
Diferente do que faziamos antes, com o Date, agora no DateTime ficou muito mais seguro comparar datas
// Repare que ele vai criar datas com time zerado
$data['inicio'] = new Datetime('2014-08-01');
$data['fim'] = new Datetime('2014-08-10');
if ($data['fim'] > $data['inicio']){
echo "Correto!";
}
Criando intervalos
$data['inicio'] = new Datetime('2014-08-01');
$data['fim'] = new Datetime('2014-08-10');
// Intervalo de 1 dia
$interval = new DateInterval("P1D");
// Crio um array com as datas do periodo definido
$periodoVigente = new DatePeriod($data['inicio'], $interval ,$data['fim']);
// Agora, percorro o array, pegando apenas datas acima ou igual hoje
foreach ($periodoVigente as $dataPeriodo)
{
if ($dataPeriodo >= $data['hoje'])
{
$dias[] = $dataPeriodo;
}
}
echo "<pre>";
var_dump($dias);
echo "</pre>";
O DateInterval vai definir o salto, neste caso estamos dizendo um salto de 1 dia quando colocamos P1D. O formato começa com a letra P, de “período”. Cada período de duração é representada por um valor inteiro seguido por um designador período. Se a duração contém elementos de tempo, a porção da especificação é precedido pela letra T.
Parâmetro | Descrição |
---|---|
Y | Anos |
M | Meses |
D | Dias |
W | Semanas |
H | Horas |
M | Anos |
S | Segundos |
Criando intervalos sem final de semana
// Transforma em datetime
$data['inicio'] = new Datetime('2014-08-01');
$data['fim'] = new Datetime('2014-08-15');
// Adiciona um dia, porque o array do foreach começa de 0
$data['fim']->modify('1 days');
// Intervalo de 1 dia
$interval = new DateInterval("P1D");
// Crio um array com as datas do periodo definido
$periodoVigente = new DatePeriod($data['inicio'], $interval ,$data['fim']);
// Agora, percorro o array, pegando apenas datas
foreach ($periodoVigente as $dataPeriodo)
{
// Se não for final de semana (php >= 5.1)
if (!(date('N', strtotime($dataPeriodo->format('Y-m-d'))) >= 6))
{
if ($dataPeriodo >= $data['hoje'])
{
$dias[] = $dataPeriodo->format('d/m/Y');
}
}
}
Deixe um comentário