How to calculate the time of each year between two dates?

9

I need to get two dates and calculate the time period of each year in isolation . For example: between dates 12/06/2012 and 12/06/2017 the correct output would be:

2012 = 5 meses e 12 dias
2013 = 12 meses
2014 = 12 meses
2015 = 12 meses
2016 = 12 meses
2017 = 5 meses e 12 dias

To find the total time between two dates I do this:

$inicio = strtotime(12-01-2012); // transformando em time
$fim = strtotime(12-06-2017); // transformando em time
$intervalo = $fim - $inicio;

And then just convert and such:

$dias = floor($intervalo / (60 * 60 * 24));

But to take the period of each year in isolation I can not imagine how. I thought of comparing the dates, and then creating for each year a different calculation (repeating everything ...), but there must be a simpler way ... Any ideas?

    
asked by anonymous 19.08.2017 / 22:07

2 answers

7

example - ideone

$date1 = "12/06/2012";
$date1 = str_replace("/", "-", $date1);
// data americana
$dateInicio = date('Y-m-d', strtotime($date1));

$date2 = "12/06/2017";
$date2 = str_replace("/", "-", $date2);
// data americana
$dateFim =  date('Y-m-d', strtotime($date2));

$time1=strtotime($date1);
// ano data inicial
$year1=date("Y",$time1);

$time2=strtotime($date2);
// ano data final
$year2=date("Y",$time2);

$difAno=$year2-$year1;
// se a diferença em anos for maior que 0 calculamos ano inicial e final
if ($difAno>0){
    // para ano inicial
    $fim = ($year1."-12-31");
    $datetime1 = new DateTime($dateInicio);
    $datetime2 = new DateTime($fim);
    $interval = $datetime1->diff($datetime2);
    echo "Ano: ".($year1)." - ";
    echo $interval->format('%m Meses %d dias');

    echo "<br>";

    // para ano final
    $inicio = ($year2."-01-01");
    $datetime1 = new DateTime($inicio);
    $datetime2 = new DateTime($dateFim);
    $interval = $datetime2->diff($datetime1);
    echo "Ano: ".($year2)." - ";
    echo $interval->format('%m Meses %d dias');

    echo "<br>";

}

// se a diferença entre os anos for maior que 1 fazemos um loop para calcular os demais
if ($difAno>1){
    for ($x = 1; $x <= $difAno-1; $x++) {

        echo "Ano: ".($year1+$x)." - ";
        echo date("z", mktime(0,0,0,12,31,($year1+$x))) + 1;
        echo " = 12 meses <br>";

    }
}
  • If we use this format of dd-mm-yyyy we will have errors, so we use the date() function that returns dates in PHP in the format you want. date ()

  • $ interval-> format - Formats a range.

  

The "Era Unix" began on January 1, 1970, and thanks to it, we can make precise date calculations. The mktime () function returns the total number of seconds that have passed since the beginning of the Unix era. The date () function can format dates based on Unix Era!

According to the author's comment

é que preciso incluir o dia final

Just include the following line in the code

$dateFim = date('Y-m-d', strtotime($dateFim. ' + 1 days'));

So we will have no ideone

    $dateFim ="";

    $date1 = "12/06/2012";
    $date1 = str_replace("/", "-", $date1);
    // data americana
    $dateInicio = date('Y-m-d', strtotime($date1));

    $date2 = "12/06/2017";
    $date2 = str_replace("/", "-", $date2);
    // data americana
    $dateFim =  date('Y-m-d', strtotime($date2));
    $dateFim = date('Y-m-d', strtotime($dateFim. ' + 1 days'));

    $time1=strtotime($date1);
    // ano data inicial
    $year1=date("Y",$time1);

    $time2=strtotime($date2);
    // ano data final
    $year2=date("Y",$time2);

    $difAno=$year2-$year1;
    // se a diferença em anos for maior que 0 calculamos ano inicial e final
    if ($difAno>0){
        // para ano inicial
        $fim = ($year1."-12-31");
        $datetime1 = new DateTime($dateInicio);
        $datetime2 = new DateTime($fim);
        $interval = $datetime1->diff($datetime2);
        echo "Ano: ".($year1)." - ";
        echo $interval->format('%m Meses %d dias');

        echo "<br>";

        // para ano final
        $inicio = ($year2."-01-01");
        $datetime1 = new DateTime($inicio);
        $datetime2 = new DateTime($dateFim);
        $interval = $datetime2->diff($datetime1);
        echo "Ano: ".($year2)." - ";
        echo $interval->format('%m Meses %d dias');

        echo "<br>";

    }

    // se a diferença entre os anos for maior que 1 fazemos um loop para calcular os demais
    if ($difAno>1){
        for ($x = 1; $x <= $difAno-1; $x++) {

            echo "Ano: ".($year1+$x)." - ";
            echo date("z", mktime(0,0,0,12,31,($year1+$x))) + 1;
            echo " = 12 meses <br>";

        }
    }
    
20.08.2017 / 00:13
2

Well from what I understood you would have to calculate only the first and last year because the others would be wasted since the result is predicted.

But if you insist, throw the years in an array then execute a foreach with the calculation, I did not test if your calculation is correct but assuming that I think the logic is more or less this:

// Faz uma função para preencher o array com os anos entre o menor e o maior.. 
$anos = array(02-06-2012,01-01-2013,01-01-2014,01-01-2015,01-01-2016,01-01-2017,12-06-2017)

// Outra função pra atribuir o ano do menor ao inicio
$inicio = strtotime(01-01-2012);

foreach($anos as $ano){
    $fim = strtotime($ano);
    $intervalo = $fim - $inicio;
    //Aqui não sei se quer imprimir ou oq, mas coloca um array pra guardar ou imprime
    $dias = floor($intervalo / (60 * 60 * 24)); 
    $inicio = $fim;
}
    
19.08.2017 / 23:24