Ir para conteúdo
Fórum Script Brasil
  • 0

Retorno em total de minutos


Walbert Costa

Pergunta

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 = ?

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Multiplique as horas por 60 (para obter os minutos), e some os minutos já "existentes".

function totalMinutos($hora) {
  $componentes = explode(":", $hora); /* separa em uma array da forma array(horas, minutos) */
  return $componentes[0] * 60 + $componentes[1]; /* multiplica as horas por 60 e soma os minutos para obter o total */
}
Aí é só usar. Exemplo:
$difminutos = totalMinutos($diferencatempo);

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi Moderador Durub,

Em primeiro lugar, muito obrigado pela sua ajuda!!!

Fiz e não deu certo, está vindo resposta "0". Abaixo colo o código para você olhar.

O problema é que na resposta da primeira função a resposta vem assim: Você fuma esse total em um intervalo de 14 Horas e 46 Minutos.

Aí eu quero que esse resultado seja o valor de (14 x 60 + 46) para transformar tudo em minutos e, então, usar a variavel de numero inteiro que tenho e dividir o total do intervalo em minutos por essa variavel inteira para retornar Qual o período em minutos que a pessoa fuma cada cigarro.

Se eu conseguir somente extrair o total de minutos da resposta: "Você fuma esse total em um intervalo de 14 Horas e 46 Minutos." o meu problema estará resolvido por o resto serão operações básicas e eu consigo fazer!

De novo, muito obrigado pela sua ajuda!!!

Aguardo qualquer ajuda que possa me dar para resolver o problema acima!

----------------CÓPIA DO CÓDIGO---------------------------------

//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.';

}

}

}

}

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

//Divisão do número de cigarros pelo tempo decorrido

function totalMinutos($hora) {

$componentes = explode(":", $hora); /* separa em uma array da forma array(horas, minutos) */

return $componentes[0] * 60 + $componentes[1]; /* multiplica as horas por 60 e soma os minutos para obter o total */

}

$intervalo = totalMinutos($diferencatempo);

Link para o comentário
Compartilhar em outros sites

  • 0

Com expressões regulares:

function totalMinutos($expressao) {
  $regex = '/(\d+) Horas? e (\d+) Minutos?/';
  preg_match($regex, $expressao, $matches);
  
  return $matches[1] * 60 + $matches[2];
}

Mas acho que aí o problema já é outro... Por que a função difDeHoras retorna uma string assim, pra começar?

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

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);

*/

Link para o comentário
Compartilhar em outros sites

  • 0

Você chegou a testar o último código que eu te dei? O código devia estar funcionando perfeitamente, só tentei chamar atenção ao fato que a função deveria retornar a hora, e não uma string completa. Isso você devia fazer ao imprimir a string para o usuário.

Abraços.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...