Classe para obter datas inciais e finais de cada mês

11 views
Skip to first unread message

Ezequias Lopes

unread,
Mar 18, 2020, 6:39:51 PM3/18/20
to php-brasil
Criei uma classe para retornar uma array contendo as datas iniciais e finais dos meses contidos em um intervalo entre duas datas.
Exemplo:

$intervaloMeses = new IntervaloData;
$intervaloMeses
= $intervaloMeses->intervaloMeses('20-03-2018', '18-07-2020');
var_dump
($intervaloMeses);

O resultado seria:

array (size=28)
 
0 =>
   
array (size=2)
     
0 => string '2018-03-01' (length=10)
     
1 => string '2018-03-31' (length=10)
 
1 =>
   
array (size=2)
     
0 => string '2018-04-01' (length=10)
     
1 => string '2018-04-30' (length=10)
 
2 =>
   
array (size=2)
     
0 => string '2018-05-01' (length=10)
     
1 => string '2018-05-31' (length=10)
 
3 =>
   
array (size=2)
     
0 => string '2018-06-01' (length=10)
     
1 => string '2018-06-30' (length=10)
 
4 =>
   
array (size=2)
     
0 => string '2018-07-01' (length=10)
     
1 => string '2018-07-31' (length=10)
 
5 =>
   
array (size=2)
     
0 => string '2018-08-01' (length=10)
     
1 => string '2018-08-31' (length=10)
[...]


O código fonte é o seguinte:

/**
* IntervaloData class
*
 * English: Using this class, using the method intervaloMeses, you can obtain the starting and ending dates of each month between two specific dates.
*
 * Portuguese: Usando esta classe, especificamente o método intervaloMeses,  é possível obter as datas inciais e finais de cada mes contido dentro de intervalo entre duas datas.
*
 * Spanish: Utilizando esta classe, especificamente el método intervaloMeses, si puede obtener las fechas iniciales y finales de cada mes contido en un rango de dos fechas.
*
* @author Ezequias Lopes
* @license MIT
*/

class IntervaloData
{
   /**
    * Retorna a quantidade de meses entre duas datas
    *
     * @param [date] $dataInicial
    * @param [date] $dataFinal
    * @return $contaMeses
    */
   public function contaMeses($dataInicial, $dataFinal)
   {
       $dataInicial = new DateTime($dataInicial);
       $dataFinal = new DateTime($dataFinal);
       $contaMeses = 0;

        $dataInicial->add(new \DateInterval('P1M'));
       while ($dataInicial <= $dataFinal) {
           $contaMeses++;
           $dataInicial->add(new \DateInterval('P1M'));
       }

        return (int) $contaMeses;
   }

    /**
    * Retorna uma array contendo a data do primeiro e último dia de um determinado mes
    *
    * @param [date] $data
    * @return $primeiroUltimoDia = array contendo a data do primeiro e último dia de um determinado mes. As datas sao possuem o formato AAAA-MM-DD (YYYY-MM-DD)
    */
   public function primeiroUltimoDia($data)
   {
       $primeiroUltimoDia = array();
       $primeiroDia = date('Y-m-01', strtotime($data));
       $ultimoDia = date('Y-m-t', strtotime($data));
       $primeiroUltimoDia[] = $primeiroDia;
       $primeiroUltimoDia[] = $ultimoDia;
       return $primeiroUltimoDia;
   }

    /**
    * Retorna uma array contendo as datas inciais e finais de cada mes entre duas datas
    *
    * @param [type] $dataInicial // Starting date // Fecha incial
    * @param [type] $dataFinal // Ending date // Fecha final
    * @return $intervaloMeses
    */
   public function intervaloMeses($dataInicial, $dataFinal)
   {
       $intervaloMeses = array();
       $contaMeses = (int) $this->contaMeses($dataInicial, $dataFinal);
       $intervaloMeses[0] = $this->primeiroUltimoDia($dataInicial);
       $dataInicial = new DateTime($dataInicial);
       for ($i = 1; $i <= $contaMeses; $i++) {
           $proximoMes = $dataInicial->modify("+1 month");
           $intervaloMeses[$i] = $this->primeiroUltimoDia($proximoMes->format('d-m-Y'));
       }
       return $intervaloMeses;
   }
}

O arquivo PHP da classe está anexado a este post.
IntervaloData.php

Fernando Friedrich

unread,
Mar 19, 2020, 4:22:41 PM3/19/20
to php-brasil
Olá Ezequias, tudo bem?

Da uma olhada no lib Carbon (https://carbon.nesbot.com/), é uma extensão à classe DateTime contendo muitos métodos interessantes para manipulação de datas.

--
Fernando Friedrich
Reply all
Reply to author
Forward
0 new messages