Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
plastiik

calc time em php exemplo 00:00:00

Recommended Posts

plastiik

é o seguinte eu quero calcular tempos para o meu trabalho de final de curso em 00:00:00, eu recebo 2 dados time deste tipo da BD 00:00:00 e queria calcular o resultado destes com o php

por exemplo:

00:01:00 + 00:02:00 = 00:03:00

como procedo?

Share this post


Link to post
Share on other sites
Knitter

Vê as funções date(), e strtotime(), existem mais mas estas duas podem ser suficientes. Com a strtotime passas uma string para um unix timestamp que depois podes usar para fazer contas, se não me engano é apenas um long. Com o date podes formatar um timestamp como quiseres, para depois apresentares o resultado formatado.

Existem mais funções de datas que podem ser úteis, verifica no manual do PHP.

Share this post


Link to post
Share on other sites
plastiik

será que alguem me pode dar um exemplo prático?

		$tmp01 = strtotime($tempo) + strtotime($tmp_penalty);

	print date('H:i:s', $tmp03);

é que até assim nem dá!

$tmp03 = round($tmp01 + $tmp02)/2*2;

mas se eu dividir por 2 dá certinho o problema é que não dá o resultado certo!

é que a conta é complemente absurda!

Share this post


Link to post
Share on other sites
Knitter

Não sei porque é que estás a somar para a variável $tmp01 e depois usas a variável $temp03, mas o exemplo será como tens.

Reparei noutra coisa, se estás a trabalhar sem horas/datas reais, é capaz de não ter dar os valores que esperas, se for esse o caso, o melhor será fazeres as contas manualmente, convertendo cada componente da hora e depois somando. Isto, se as horas/datas não forem reais, porque as funções de data e tempo podem dar valores esquisitos nessas situações.

Share this post


Link to post
Share on other sites
plastiik

isso foi a modificar o codigo aqui no post esqueci-me de por $tmp01 ahah mas no meu está certo  :wallbash:

a minha aplicação tem que fazer contas neste formato por exemplo:

00:03:00 + 00:00:10 = (00:03:10) -> isto deverá ser o resultado da conta!

o que é completamente estranho é que seu eu só dividir dá certo -.-

Share this post


Link to post
Share on other sites
Knitter

Uma coisa é o formato, outra coisa são os valores. Quando dizes "neste formato" eu olho apenas para o formato e assumo, como assumi, que os valores fossem apenas um exemplo, falha minha porque dessa maneira as funções de tempo são algo inúteis dado que isso não são datas válidas.

Não estou a ver nenhuma função para isso, mas podes sempre confirmar no manual do PHP, pelo que me parece que vais ter de fazer isso à mão, somando cada componente individualmente.

Share this post


Link to post
Share on other sites
plastiik

o problema é esse já procurei no php e nõ vi nenhuma solução, alem de nem saber como separar cada componente :S

Share this post


Link to post
Share on other sites
Knitter

Para separar a componente não precisas mais que usar a função split(), para fazer a soma manual é só somar inteiros.


$arrayComponentes1 = split(':', '00:03:00');
$arrayComponentes2 = split(':', '00:00:10');

$arrayResultado = array(intval($arrayComponentes1[0]) + intval($arrayComponentes2[0]), 
            $arrayResultado[1] = intval($arrayComponentes1[1]) + intval($arrayComponentes2[1]),
            $arrayResultado[1] = intval($arrayComponentes1[2]) + intval($arrayComponentes2[2])
);

Isto na forma mais básica soma os valores, estou a usar intval mas podes simplesmente fazer cast para int, podes não usar o array de resultados, precisas adicionar lógica para quando os segundos passam de 60, e se quiseres formatar o resultado podes usar a função sprintf e colocar formatação.

Assim por alto acho que resolve o problema.

Share this post


Link to post
Share on other sites
plastiik

eu tenho uma solução + simples... passo os valores em int para a base de dados depois ele faz as contas certas o unico prob é passar time_to_sec a inserir valores na BD

btw a tua solução não deu :S

insert into tempo values (null, 2, 1, 1, TIME_TO_SEC(00:06:24), 1)

e ainda por cima tenho que apresentar o trabalho de final de curso amanha e sem isto não posso fazer a secção final, ou seja xumbo de certeza :S e já tou há umas 8h há procura de solução

Share this post


Link to post
Share on other sites
Knitter

A minha solução não era uma solução era um pseudo-código para exemplificar como poderias tentar fazer a soma das componentes. Olhando para o que está, não vejo problemas de maior nem razão para não funcionar. Aliás, o vector final deve ter as contas correctas.

Ir à BD para fazer uma coisa tão simples, não parece muito correcto, onde é que estás a ter dificuldade? Foste ver o manual das funções que coloquei?

Share this post


Link to post
Share on other sites
plastiik

ya fui, para ser-te sincero nunca tinha trabalhado com datas é a minha primeira vez por isso tou assim um pouco desnorteado, mas já percebi um pouco como a coisa funca, mesmo assim tou a testar bastante sem exito, só mesmo com a solução da BD por os resoltados em int e depois converter para 00:00:00

Share this post


Link to post
Share on other sites
plastiik

se tiveres curioso foi assim que resolvi

mudei o campo da base de dados para int e fiz o seguinte:

$result = mysql_query("SELECT piloto, local, motivo, tempo, tmp_penalty, (tempo+tmp_penalty) as total FROM tempo, etapas, concorrentes, rali_epoca_etapa, penalizacao where tempo.id_concorrentes=concorrentes.id_concorrentes and tempo.id_etapas=rali_epoca_etapa.id_etapas and tempo.id_rali_epoca=rali_epoca_etapa.id_rali_epoca and rali_epoca_etapa.id_etapas=etapas.id_etapas and tempo.id_penalizacao=penalizacao.id_penalizacao and tempo.id_rali_epoca=$id_rali_epoca and etapas.id_rali=$id_rali and etapas.id_etapas=$id_etapas order by total");
while ($row = mysql_fetch_object($result)) {
	$piloto = $row->piloto;
	$local = $row->local;
	$tempo = $row->tempo;
	$penalty = $row->motivo;
	$tmp_penalty = $row->tmp_penalty;

	$tmp_total = $tempo + $tmp_penalty;

	$contador++;

	$tmp03 = $tempo + $tmp_penalty;

	echo"<tr>
			<td><center>$contador º</center></td>
			<td><h1>$piloto</h1></td>
			<td>$local</td>
			<td><center>"; print date('H:i:s', $tempo); echo"</center></td>
			<td><center>"; print date('H:i:s', $tmp_penalty); echo"</center></td>
			<td><center>$penalty</center></td>
			<td><center>"; print date('H:i:s', $tmp_total); echo"</center></td>
			<td><center><a title='Edita(tempo)' href='index.php?mod=edita_tempo'><img src='images/pencil.png'/></a>  <a title='Apaga(tempo)' href='index.php?mod=apaga_tempo'><img src='images/cross.png'/></center></td>
		</tr>";
}
mysql_free_result($result);

muito mais simples, e assim posso utilizar o sql para fazer posiçoes e isso :) simples :)

o problema da tua solução final é organizar os tempos, isso tem que ser mesmo na query, mas muito bom mesmo :D

Share this post


Link to post
Share on other sites
plastiik

espero bem que sim :) acabo o curso amanha, :) espero trabalhar na área que é o que gosto, seja sofware ou web :D desde que seja programação :thumbsup:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.