Ir para conteúdo

Arquivado

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

Douglas Fernandess

problema na soma horas minutos segundos php e mysql

Recommended Posts

To com um problema na hora de soma os valores de horas minutos segundos tenho o seguinte

 

numero 54 9999-9999 duracao 00:00:15

numero 54 9999-9999 duracao 00:00:45

 

teria que ficar numero 54 9999-9999 duração 00:01:00 pórem fica assim 00:00:60

se o número já estiver no banco de dados eu somo a minutagem que está la...

 

meu code é o seguinte

 

 

 
calculo($arquivo = fopen("teste2.csv", "r"));
 
 
function calculo($arquivo){
 
while (($linha = fgets($arquivo)) !== FALSE) {
 
    $pedacos = explode(";", $linha);
 
/*PROCURAR PALAVRA*/
$procurar = utf8_decode('Ligações para outros celulares');
$key = array_search($procurar, $pedacos); 
 
  
if($key && $pedacos['3'] != ''){
 
//DEBUG
 echo '<pre>';
 echo 'Celular: '.$pedacos['1']. ' | Minutos: '.$pedacos['3']. ' | TIPO: '.$pedacos['4'];
 echo '</pre>';
 
if($pedacos['4'] == $procurar){
$tipo_de_uso = '5';
}
 
 
$VeriNumero = read('calcule_sua_conta',"WHERE numero = '$pedacos[1]'");
 
if($VeriNumero >= 1){
foreach($VeriNumero as $Numero);
 
$tempo    = $pedacos['3'];
$segundos = 0;
 
list( $h, $m, $s ) = explode( ':', $tempo ); 
 
$segundos += $h * 3600;
$segundos += $m * 60;
$segundos += $s;
 
 
$horas = floor( $segundos / 3600 ); 
$segundos %= 3600; 
$minutos = floor( $segundos / 60 );
$segundos %= 60;
 
 
$t1 += $horas;
$t2 += $minutos;
$t3 += $segundos;
 
while( $t3 >= 60 ) {
$t2++;
$t3 = $t3 - 60;
}
 
while( $t2 >= 60 ) {
$t1++;
$t2 = $t2 - 60;
}
 
 
 
$tempo    = $Numero['duracao'];
$segundos = 0;
 
list( $h, $m, $s ) = explode( ':', $tempo ); 
 
$segundos += $h * 3600;
$segundos += $m * 60;
$segundos += $s;
 
 
$horas = floor( $segundos / 3600 ); 
$segundos %= 3600; 
$minutos = floor( $segundos / 60 );
$segundos %= 60;
 
 
$tt1 += $horas;
$tt2 += $minutos;
$tt3 += $segundos;
 
while( $tt3 >= 60 ) {
$tt2++;
$tt3 = $tt3 - 60;
}
 
while( $tt2 >= 60 ) {
$tt1++;
$tt2 = $tt2 - 60;
}
 
$total_min = str_pad($t1+$tt1,2,0,STR_PAD_LEFT).':'.str_pad($t2+$tt2,2,0,STR_PAD_LEFT).':'.str_pad($t3+$tt3,2,0,STR_PAD_LEFT);
 
//$total_min = ($Numero['minutos'] + $d1);
 
 
$up = mysql_query("UPDATE calcule_sua_conta SET duracao = '$total_min' WHERE numero = '$pedacos[1]'") or die(mysql_error());
echo $t1.':'.$t2.':'.$t3;
}else{
$cad = mysql_query("INSERT INTO calcule_sua_conta  (numero, duracao, tipo_de_uso) 
VALUES ('$pedacos[1]', '$pedacos[3]', '$tipo_de_uso')") or die(mysql_error());
 
}
 
 
} //fim key search
 
}//fim leitura
 
 
}//function
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilize a biblioteca DateTime, existem vários meios de se realizar o cálculo através dela.

 

Mas todos utilizam o princípio em criar o formato DateInterval e subtrair dois horários.

 

O exemplos que trago aqui serão, criar um "horário zero". E a partir desse "horário zero", verificar a diferença da soma dela mesma com os valores atribuídos.

 

O correto seria:

//"Horário zero"
$data = new DateTime('00:00:00');

//Horário para soma
$total = new DateTime('00:00:00');

$dateIntervalSoma1 = new DateInterval('PT45S');
$dateIntervalSoma2 = new DateInterval('PT15S');

//adiciona no horário para soma.
$total->add($dateIntervalSoma1);
$total->add($dateIntervalSoma2);

echo $data->diff($total)->format('%H:%I:%S');
Saída:

00:01:00

O segundo exemplo, evita a conversão dos formatos que você já possui. E faz exatamente a mesma coisa

//"Horário zero"
$data = new DateTime('00:00:00');

//Horário para soma
$total = new DateTime('00:00:00');

//intervalos de tempo
$dataSoma1 = new DateTime('00:00:45');
$dataSoma2 = new DateTime('00:00:15');

//Retorna o intervalo de tempo, no formato DateInterval e adiciona no horário para soma.
$total->add($data->diff($dataSoma1));
$total->add($data->diff($dataSoma2));

//retorna a diferença do "horário zero" com o horário somado.
echo $data->diff($total)->format('%H:%I:%S');
Saída:

00:01:00

Apesar dos tempos serem intervalos de data, você não pode somar um DateInterval com outro, apenas adiciona-los a um DateTime existente, por isso da necessidade de um DateTime inicial e um para soma.

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.