Jump to content
Fórum Script Brasil
  • 0

Retorno em total de minutos


Walbert Costa

Question

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 to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...