Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

walbert

PHP - Diferença entre horas

Recommended Posts

Olá Pessoal,

SOU NOVATO EM PHP!

Estou fazendo uma aplicação em uma IDE de PHP e tenho que verificar a diferença entre dois horários do mesmo dia. O código abaixo faz tudo isso. Ele me dá a resposta correta para o problema!

O que eu quero agora é dividir o resultado que obtenho da diferença das horas por um núemro inteiro.

Explicando:

No código abaixo se eu colocar a hora inicial como: 08:15 e a hora final como: 15:23 ele me retornará como resultado do intervalo o valor de 7 horas e 7 minutos. O que eu quero agora é pegar o resultado (7 horas e 7 minutos) e dividir por um número inteiro. Por exemplo dividir por 8.

Alguém poderia me ajudar a complementar o código? Se possível com comentário?

As variáveis são:

Para o número inteiro é: $numero

Para o resultado é: $intervalo

Agradeço muito a ajuda e muito obrigado a todos do fórum!

 

 

-------------------------INICIO DO CÓDIGO-----------------------------------------

 

function difDeHoras($hIni, $hFinal)
{        
   // Separa á hora dos minutos
   $hIni = explode(':', $hIni);
   $hFinal = explode(':', $hFinal);

   // Converte a hora e minuto para segundos
   $hIni = (60 * 60 * $hIni[0]) + (60 * $hIni[1]);
   $hFinal = (60 * 60 * $hFinal[0]) + (60 * $hFinal[1]);

   // Verifica se a hora final é maior que a inicial
   if(!($hIni < $hFinal)) {
       return false;
   }

   // Calcula diferença de horas
   $difDeHora = $hFinal - $hIni;

   //Converte os segundos para Hora e Minuto
   $tempo = $difDeHora / (60 * 60);
   $tempo = explode('.', $tempo); // Aqui divide o restante da hora, pois se não for inteiro, retornará um decimal, o minuto, será o valor depois do ponto.
   $hora = $tempo[0];
   @$minutos = (float) (0) . '.' . $tempo[1]; // Aqui forçamos a conversão para float, para não ter erro.
   $minutos = $minutos * 60; // Aqui multiplicamos o valor que sobra que é menor que 1, por 60, assim ele retornará o minuto corretamente, entre 0 á 59 minutos.
   $minutos = explode('.', $minutos); // Aqui damos explode para retornar somente o valor inteiro do minuto. O que sobra será os segundos
   $minutos = $minutos[0];
//Aqui faz uma verificação, para retornar corretamente as horas, mas se não quiser, só mandar retornar a variavel hora e minutos
   if (!(isset($tempo[1]))) {
       if($hora == 1){
           return 'intervalo de ' . $hora . ' Hora.';
       } else {
           return 'intervalo de ' . $hora . ' Horas.';
       }
   } else {
       if($hora == 1){
           if($minutos == 1){
               return 'intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minuto.';
           } else {
               return 'intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minutos.';
           }
       } else {
           if($minutos == 1){
               return 'intervalo de ' . $hora . ' Horas e ' .$minutos . ' Minuto.';
           } else {
               return 'intervalo de ' . $hora . ' Horas e ' .$minutos . ' Minutos.';
           }
       }
   }
}

$diferencatempo = difDeHoras($inicial, $fim);

 

-------------------------FIM DO CÓDIGO-----------------------------------------

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode obter o timestamp Unix para das horas de início e fim. Diminuir a menor da maior e após transformar novamente em hora.

Segue o exemplo.

 

$horaInicial = '8:30';
$horaFinal = '18:36';

//Separa Hora e Minutos
$horaInicial = explode( ':', $horaInicial );
$horaFinal = explode( ':', $horaFinal );

//Obtém o timestamp Unix. Seguindo, no seu caso, a ordem Hora/Minuto.
$horaIni = mktime( $horaInicial[0], $horaInicial[1]);
$horaFim = mktime( $horaFinal [0], $horaFinal [1]);

//Verifica a dirença entre os horários
$horaDiferenca = $horaFim - $horaIni;

//Imprime a diferença entre eles
echo "A diferença é de ".date('H',$horaDiferenca ).":".date('i',$horaDiferenca );

 

Acredito que isso pode resolver o seu problema.

 

 

Para maiores informações sobre cada função usada.

http://php.net/manual/en/function.explode.php

http://www.php.net/manual/pt_BR/function.mktime.php

http://www.php.net/manual/pt_BR/function.date.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só o finalzinho aí, dá pra simplificar:

//Imprime a diferença entre eles
echo "A diferença é de ".date('H:i',$horaDiferenca );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito, muito, muito obrigado Gabriel e Henrique:

Resolvi o meu problema com o código abaixo que obtive de resposta de outro fórum!

 

Agora estou com o seguinte problema: Leiam tudo e o código está abaixo:

 

 

Olá Pessoal,

Estou fazendo uma aplicação em uma IDE de PHP e tenho que verificar a diferença entre dois horários do mesmo dia. O código abaixo faz tudo isso. Ele me dá a resposta correta para o problema!

O que eu quero agora é dividir o resultado que obtenho da diferença das horas por um núemro inteiro.

Explicando:

No código abaixo se eu colocar a hora inicial como: 08:15 e a hora final como: 15:23 ele me retornará como resultado do intervalo o valor de 7 horas e 7 minutos. O que eu quero agora é pegar o resultado (7 horas e 7 minutos) e dividir por um número inteiro. Por exemplo dividir por 8.

Alguém poderia me ajudar a complementar o código? Se possível com comentário?

As variáveis são:

Para o número inteiro é: $numero

Para o resultado é: $intervalo

Agradeço muito a ajuda e muito obrigado a todos do fórum!

 

function difDeHoras($hIni, $hFinal)
{        
   // Separa á hora dos minutos
   $hIni = explode(':', $hIni);
   $hFinal = explode(':', $hFinal);

   // Converte a hora e minuto para segundos
   $hIni = (60 * 60 * $hIni[0]) + (60 * $hIni[1]);
   $hFinal = (60 * 60 * $hFinal[0]) + (60 * $hFinal[1]);

   // Verifica se a hora final é maior que a inicial
   if(!($hIni < $hFinal)) {
       return false;
   }

   // Calcula diferença de horas
   $difDeHora = $hFinal - $hIni;

   //Converte os segundos para Hora e Minuto
   $tempo = $difDeHora / (60 * 60);
   $tempo = explode('.', $tempo); // Aqui divide o restante da hora, pois se não for inteiro, retornará um decimal, o minuto, será o valor depois do ponto.
   $hora = $tempo[0];
   @$minutos = (float) (0) . '.' . $tempo[1]; // Aqui forçamos a conversão para float, para não ter erro.
   $minutos = $minutos * 60; // Aqui multiplicamos o valor que sobra que é menor que 1, por 60, assim ele retornará o minuto corretamente, entre 0 á 59 minutos.
   $minutos = explode('.', $minutos); // Aqui damos explode para retornar somente o valor inteiro do minuto. O que sobra será os segundos
   $minutos = $minutos[0];
//Aqui faz uma verificação, para retornar corretamente as horas, mas se não quiser, só mandar retornar a variavel hora e minutos
   if (!(isset($tempo[1]))) {
       if($hora == 1){
           return 'intervalo de ' . $hora . ' Hora.';
       } else {
           return 'intervalo de ' . $hora . ' Horas.';
       }
   } else {
       if($hora == 1){
           if($minutos == 1){
               return 'intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minuto.';
           } else {
               return 'intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minutos.';
           }
       } else {
           if($minutos == 1){
               return 'intervalo de ' . $hora . ' Horas e ' .$minutos . ' Minuto.';
           } else {
               return 'intervalo de ' . $hora . ' Horas e ' .$minutos . ' Minutos.';
           }
       }
   }
}

$diferencatempo = difDeHoras($inicial, $fim);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Serha mais ou menos assim?

$tm = $horas /60 + $minutos; $tm /= 8;  $horas = round($tm/60);$minutos= $tm % 60; 

nao sei se é esse o problema

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, tudo bem?

Estou com uma dúvida simples no código abaixo e não consigo resolver. A função abaixo me retorna o que eu quero: a diferença entre duas variaveis de horas ($inicial, $fim). Seu colocar, por exemplo: $inicial = 9:30 e $fim = 13:45 retorno o seguinte resultado é: O intervalo é de: 4 Horas e 15 Minutos.

O que eu quero agora, e não consigo é: Pegar esse intevalo e transformar em minutos para aparecer na variavel $difminutos. Preciso dessa variável em minutos fora de função para continuar com outros cálculos.

Pode me ajudar?

 

//A função que retorna a diferença entre hora inicial e hora final
function difDeHoras($hIni, $hFinal)
{        
   // Separa á hora dos minutos
   $hIni = explode(':', $hIni);
   $hFinal = explode(':', $hFinal);

   // Converte a hora e minuto para segundos
   $hIni = (60 * 60 * $hIni[0]) + (60 * $hIni[1]);
   $hFinal = (60 * 60 * $hFinal[0]) + (60 * $hFinal[1]);

   // Verifica se a hora final é maior que a inicial
   if(!($hIni < $hFinal)) {
       return false;
   }

   // Calcula diferença de horas
   $difDeHora = $hFinal - $hIni;

   //Converte os segundos para Hora e Minuto
   $tempo = $difDeHora / (60 * 60);
   $tempo = explode('.', $tempo); // Aqui divide o restante da hora, pois se não for inteiro, retornará um decimal, o minuto, será o valor depois do ponto.
   $hora = $tempo[0];
   @$minutos = (float) (0) . '.' . $tempo[1]; // Aqui forçamos a conversão para float, para não ter erro.
   $minutos = $minutos * 60; // Aqui multiplicamos o valor que sobra que é menor que 1, por 60, assim ele retornará o minuto corretamente, entre 0 á 59 minutos.
   $minutos = explode('.', $minutos); // Aqui damos explode para retornar somente o valor inteiro do minuto. O que sobra será os segundos
   $minutos = $minutos[0];

//Aqui faz uma verificação, para retornar corretamente as horas, mas se não quiser, só mandar retornar a variavel hora e minutos
   if (!(isset($tempo[1]))) {
       if($hora == 1){
           return 'Você esse total fuma em um intervalo de ' . $hora . ' Hora.';
       } else {
           return 'Você fuma esse total em um intervalo de ' . $hora . ' Horas.';
       }
   } else {
       if($hora == 1){
           if($minutos == 1){
               return 'Você esse total fuma em um intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minuto.';
           } else {
               return 'Você fuma esse total em um intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minutos.';
           }
       } else {
           if($minutos == 1){
               return 'Você fuma esse total em um intervalo de ' . $hora . ' Horas e ' .$minutos . ' Minuto.';
           } else {
               return 'Você fuma esse total em um intervalo de ' . $hora . ' Horas e ' .$minutos . ' Minutos.';
           }
       }
   }
}

//Essa operação me retorna a diferença entre hora inicial e hora final
$diferencatempo = difDeHoras($inicial, $fim);

//Isso é que eu quero, a diferença acima que vem em horas : minutos, apenas em minutos (O TOTAL EM MINUTOS)
$difminutos = ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for só converter horas x:y é só multiplicar x por sessenta e somar com os minutos

$total = $horas * 60 + $minutos ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Daniel,

Assim não resolve!

Eu tenho que retirar as variaveis: $hora e $minutos de dentro da função e converter ambas para minutos (no caso seria converter $hora e somar com $minutos). O resultado da minha função vem assim: Você fuma esse total em um intervalo de 14 Horas e 46 Minutos.

O que eu quero é pegar essas 14 horas e 46 minutos e transformar tudo em minutos e colocar na minha variavel: $intervaloemminutos.

Já tentei de tudo aqui e não consigo fazer isso!

Agradeço e peço por mais ajuda sua e de outros que participam do forum!

Abs,

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que eu quero é pegar a variável $hora dentro da função, multiplicar por 60, somar com a variavel $minutos e dividir a soma das 2 variaveis por uma outra variavel de numero inteiro.

Por exemplo: a resposta da função dará 2 horas e 30 minutos e minha variavel de numero inteiro será 10. Então eu quero é multiplicar 2 horas por 60 e somar com 30 minutos e dividir por 10 o resultado dará : 15 para esse exemplo.

 

Para explicar tudo melhor estou enviando uma tela com o form de entrada e com os resultados abaixo de retorno para que entenda melhor:

 

teladosite.gif

 

 

O código abaixo retorno a imagem acima:

 

 

ESSE É O CÓDIGO QUE RETORNA A TELA QUE ENVIEI:

 

//Mostra o total de cigarros
$totalcigarros = $cigarros;

function difDeHoras($hIni, $hFinal)
{ 
// Separa á hora dos minutos
$hIni = explode(':', $hIni);
$hFinal = explode(':', $hFinal);

// Converte a hora e minuto para segundos
$hIni = (60 * 60 * $hIni[0]) + (60 * $hIni[1]);
$hFinal = (60 * 60 * $hFinal[0]) + (60 * $hFinal[1]);

// Verifica se a hora final é maior que a inicial
if(!($hIni < $hFinal)) {
return false;
}

// Calcula diferença de horas
$difDeHora = $hFinal - $hIni;

//Converte os segundos para Hora e Minuto
$tempo = $difDeHora / (60 * 60);
$tempo = explode('.', $tempo); // Aqui divide o restante da hora, pois se não for inteiro, retornará um decimal, o minuto, será o valor depois do ponto.
$hora = $tempo[0];
@$minutos = (float) (0) . '.' . $tempo[1]; // Aqui forçamos a conversão para float, para não ter erro.
$minutos = $minutos * 60; // Aqui multiplicamos o valor que sobra que é menor que 1, por 60, assim ele retornará o minuto corretamente, entre 0 á 59 minutos.
$minutos = explode('.', $minutos); // Aqui damos explode para retornar somente o valor inteiro do minuto. O que sobra será os segundos
$minutos = $minutos[0];

//Aqui faz uma verificação, para retornar corretamente as horas, mas se não quiser, só mandar retornar a variavel hora e minutos
if (!(isset($tempo[1]))) {
if($hora == 1){
return 'Você esse total fuma em um intervalo de ' . $hora . ' Hora.';
} else {
return 'Você fuma esse total em um intervalo de ' . $hora . ' Horas.';
}
} else {
if($hora == 1){
if($minutos == 1){
return 'Você esse total fuma em um intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minuto.';
} else {
return 'Você fuma esse total em um intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minutos.';
}
} else {
if($minutos == 1){
return 'Você fuma esse total em um intervalo de ' . $hora . ' Horas e ' .$minutos . ' Minuto.';
} else {
return 'Você fuma esse total em um intervalo de ' . $hora . ' Horas e ' .$minutos . ' Minutos.';
}
}
}
}

//Retorna a função acima
$diferencatempo = difDeHoras($inicial, $fim);

/*O que eu quero agora é o resultado para $intervalo, mas primeiro tenho que extrair do resultado da função acima (que vem assim: Você fuma esse total em um intervalo de 14 Horas e 34 Minutos, ela vem para a variavel: $diferencatempo.) o número total em minutos para aí sim, pegar esse valor e dividir por 16, me retornando o tão esperado $intervalo :: Tá aí o meu problema!
Observação: A classificação das variáveis são: ($cigarros = Number), ($inicial = Texto) e ($fim = Texto)
Resumindo: O que quero é o resultado para $intervalo que será: $intervalo = ($diferencatempo / $totalcigarros);
*/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fazendo em outra função ficaria mais ou menos assim:

 

function intervalo($cigarros, $inic , $fi){
$iniarr = explode(":" , $inic);//aqui transforma inicial em array
$fiarr = explode(":", $fi);//aqui transforma final em array
$inimin = $iniarr[0] * 60+  $iniarr[1];//transforma inicial em minutos
$fimin = $fiarr[0] * 60+  $fiarr[1];//transforma final em minutos
$diferenca = $fimin - $inimi;//calcula a diferenca
$intervalo = $diferenca / cigarros ;//aqui o tão esperado intervalo
return "O intervalo entre cada cigarro é:". intervalo . "minutos";//aqui retorna tudo
}

 

não sei se tem algum erro de sintaxe mas provavelmente vai funcionar,

 

São dois tópicos, agora que eu vi

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Daniel,

Desculpa te incomodar tanto, mas não deu certo (meu conhecimento de PHP não é bom).

Tentei de tudo aqui e até alterei a função para as variáveis que estão na imagem acima e ficou assim:

Minhas variáveis de entrada e saída estão na imagem que enviei.

 

function intervalo($cigarros, $inicial , $fim){
$inicial = explode(":" , $inicial);//aqui transforma inicial em array
$fim = explode(":", $fim);//aqui transforma final em array
$inicial = $inicial[0] * 60+  $inicial[1];//transforma inicial em minutos
$fim = $fim[0] * 60+  $fim[1];//transforma final em minutos
$diferenca = $fim - $inicial;//calcula a diferenca
$intervalo = $diferenca / cigarros ;//aqui o tão esperado intervalo
return "O intervalo entre cada cigarro é:". $intervalo . "minutos";//aqui retorna tudo
}

//Intervalo usando a função do Daniel
$intervalo = intervalo($cigarros, $inicial , $fim);

 

Daniel, as resposta que vem é: O intervalo entre cada cigarro é:minutos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai galera uma class que eu criei, espero que sirva para vcs:

<?php
    
    date_default_timezone_set('America/Sao_paulo');
    
    class calculaTempo {

        // retorna diferença em dias, horas, minutos, segundos
        function completo($data){
            $hora_data_atual = date("Y-m-d H:i:s");
            $data = strtotime($data);
            $hora_data_atual = strtotime($hora_data_atual);
            $diferenca = $hora_data_atual - $data;
            $dias = floor($diferenca / 86400);
            $horas = floor($diferenca / 3600);
            $minutos = floor(($diferenca / 60) % 60);
            $segundos = floor($diferenca % 60);
            $resultado = "{$dias} dias e {$horas}:{$minutos}:{$segundos} horas";
            return $resultado;
        }
        
        // retorna diferença em horas, minutos, segundos
        function tempo($data){
            $hora_data_atual = date("Y-m-d H:i:s");
            $data = strtotime($data);
            $hora_data_atual = strtotime($hora_data_atual);
            $diferenca = $hora_data_atual - $data;
            $hora = floor($diferenca / 3600);
            $minutos = floor(($diferenca / 60) % 60);
            $segundos = floor($diferenca % 60);
            $resultado = "{$hora}:{$minutos}:{$segundos}";
            return $resultado;
        }
        
        // retorna diferença em dias
        function dias($data){
            $hora_data_atual = date("Y-m-d H:i:s");
            $data = strtotime($data);
            $hora_data_atual = strtotime($hora_data_atual);
            $diferenca = $hora_data_atual - $data;
            $dias = floor($diferenca / 86400);
            return $dias;        
        }
        
        // retorna diferença em horas
        function horas($data){
            $hora_data_atual = date("Y-m-d H:i:s");
            $data = strtotime($data);
            $hora_data_atual = strtotime($hora_data_atual);
            $diferenca = $hora_data_atual - $data;
            $horas = floor($diferenca / 3600);
            return $horas;        
        }

        // retorna diferença em minutos
        function minutos($data){
            $hora_data_atual = date("Y-m-d H:i:s");
            $data = strtotime($data);
            $hora_data_atual = strtotime($hora_data_atual);
            $diferenca = $hora_data_atual - $data;
            $minutos = floor($diferenca / 60);
            return $minutos;        
        }
        
        // retorna diferença em segundos
        function segundos($data){
            $hora_data_atual = date("Y-m-d H:i:s");
            $data = strtotime($data);
            $hora_data_atual = strtotime($hora_data_atual);
            $diferenca = $hora_data_atual - $data;
            $segundos = $diferenca;
            return $segundos;        
        }
    
    }

    $res = new calculaTempo();
    
    $data = '2013-04-30 18:00:00';
    
    $completo = $res->completo($data); // dias - horas , minutos e segundos
    $tempo = $res->tempo($data); // horas , minutos e segundos
    $dias = $res->dias($data); // dias
    $horas = $res->horas($data); // horas
    $minutos = $res->minutos($data); // minutos
    $segundos = $res->segundos($data); // segundos
    

    
    
    echo "<font size='2'>[dia] - [Hora][minutos][segundos]:</font> <b>" . $completo ."</b><br>";
    echo "<font size='2'>[Hora][minutos][segundos]:</font> <b>" . $tempo ."</b><br>";
    echo "<font size='2'>[Dias]:</font>  <b>" . $dias ."</b><br>";
    echo "<font size='2'>[Horas]:</font>  <b>" . $horas ."</b><br>";
    echo "<font size='2'>[Minutos]:</font>  <b>" . $minutos ."</b><br>";
    echo "<font size='2'>[Segundos]:</font>  <b>" . $segundos ."</b><br>";
    
   
    
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.