Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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]; 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-----------------------------------------
Só o finalzinho aí, dá pra simplificar:
//Imprime a diferença entre eles
echo "A diferença é de ".date('H:i',$horaDiferenca );
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]; 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);Serha mais ou menos assim?
$tm = $horas /60 + $minutos; $tm /= 8; $horas = round($tm/60);$minutos= $tm % 60;
nao sei se é esse o problemaOlá, 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 = ?
Se for só converter horas x:y é só multiplicar x por sessenta e somar com os minutos
$total = $horas * 60 + $minutos ;
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,
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:
/applications/core/interface/imageproxy/imageproxy.php?img=http://www.byjoomla.com.br/diversos/teladosite.gif&key=9e9bde319126feb8678b901233ab286ac0b94745de5427ea59f0f52d374cc328" alt="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)$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.';return 'Você fuma esse total em um intervalo de ' . $hora . ' Horas.';
}if($hora == 1){
if($minutos == 1){
return 'Você esse total fuma em um intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minuto.';return 'Você fuma esse total em um intervalo de ' . $hora . ' Hora e ' .$minutos . ' Minutos.';
}if($minutos == 1){
return 'Você fuma esse total em um intervalo de ' . $hora . ' Horas e ' .$minutos . ' Minuto.';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);
*/
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
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
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>";
?>Ótimo. Na medida pra mim, apenas com algumas adaptações. Obrigado.
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.
//Separa Hora e Minutos
//Obtém o timestamp Unix. Seguindo, no seu caso, a ordem Hora/Minuto.
//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