Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

plastiik

calc time em php exemplo 00:00:00

Mensagens Recomendadas

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 -.-

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
plastiik

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.