Ir para conteúdo

Arquivado

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

joeythai

Como pegar a diferença entre Datas

Recommended Posts

Boa tarde pessoal,

 

Preciso pegar duas datas do meu banco de dados e calcular a diferença, por exemplo, eu clico no botão iniciar do meu formulário e ele salva na minha base de dados da coluna inicio a data e hora atual e com o php eu imprimo essa data, o formulário possui o botão parar, este, quando clicado, também salva a data e hora atual, porém, eu pego a data e hora atual e subtraio a data de inicio que já está salva na base de dados, com o php eu imprimo esta informação na coluna duração da aplicação, o problema é que está sendo salvo somente a data as horas ficam exibindo somente 21:00:00, alguém sabe o que pode estar acontecendo ? Vou tentar pegar as duas informações da minha base de dados por enquanto e ver se consigo evoluir.

if(isset($_GET['parar'])){
  extract($_GET);
$cod_id = $_GET['cod_id'];
      $dataF = date('Y-m-d H:i:s');
      
$data1 = mysql_fetch_array(mysql_query("select inicio from tb_time_acionamento where cod_id = '$cod_id'"));
$data2 = date('Y-m-d H:i:s');


$unix_data1 = strtotime($data1);
$unix_data2 = strtotime($data2);


$nHoras   = ($unix_data2 - $unix_data1) / 3600;
$nMinutos = (($unix_data2 - $unix_data1) % 3600) / 60;




$total = sprintf('%02d:%02d:%02d', $nHoras, $nMinutos);
  
  $upDados = "UPDATE tb_time_acionamento SET fim = '$dataF', status = 'Encerrado', total='".formataDataMysql($total)."' WHERE cod_id = '$cod_id' AND fim is NULL";
  
mysql_query($upDados) or die(' Erro ao realizar o update '.mysql_errno()); 


$vai ='acionamento_teste.php';
header('Location: '.$vai);
  }  

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use DateTime no lugar, lhe garantirá um controle maior sobre a data/hora.

 

Eu disponibilizei uma classe para cálculo de horas trabalhadas um tempo atrás, você pode ajustar conforme a sua necessidade:

http://forum.imasters.com.br/topic/525533-classe-php/

 

Eu tenho uma versão atualizada para o PHP 5.6, só não disponibilizei ainda.

 

Aqui seguem outros links com cálculos de hora:

http://forum.imasters.com.br/topic/517423-calculo-errado-ao-tranformar-timestamp-em-quantidade-de-dias-e-horas/

http://forum.imasters.com.br/topic/488188-date-format-pdo/

http://forum.imasters.com.br/topic/526345-classe-diff-diferenciar-campos-datetimes/

http://forum.imasters.com.br/topic/484930-strtotime-calculando-errado/?p=1925980

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use DateTime no lugar, lhe garantirá um controle maior sobre a data/hora.

 

Eu disponibilizei uma classe para cálculo de horas trabalhadas um tempo atrás, você pode ajustar conforme a sua necessidade:

http://forum.imasters.com.br/topic/525533-classe-php/

 

Eu tenho uma versão atualizada para o PHP 5.6, só não disponibilizei ainda.

 

Aqui seguem outros links com cálculos de hora:

http://forum.imasters.com.br/topic/517423-calculo-errado-ao-tranformar-timestamp-em-quantidade-de-dias-e-horas/

http://forum.imasters.com.br/topic/488188-date-format-pdo/

http://forum.imasters.com.br/topic/526345-classe-diff-diferenciar-campos-datetimes/

http://forum.imasters.com.br/topic/484930-strtotime-calculando-errado/?p=1925980

Obrigado pela força, mas acredito que a classe é muito complexa para o que eu preciso, só queria entender o porque as horas não estão sendo exibidas com o meu exemplo.

Use DateTime no lugar, lhe garantirá um controle maior sobre a data/hora.

 

Eu disponibilizei uma classe para cálculo de horas trabalhadas um tempo atrás, você pode ajustar conforme a sua necessidade:

http://forum.imasters.com.br/topic/525533-classe-php/

 

Eu tenho uma versão atualizada para o PHP 5.6, só não disponibilizei ainda.

 

Aqui seguem outros links com cálculos de hora:

http://forum.imasters.com.br/topic/517423-calculo-errado-ao-tranformar-timestamp-em-quantidade-de-dias-e-horas/

http://forum.imasters.com.br/topic/488188-date-format-pdo/

http://forum.imasters.com.br/topic/526345-classe-diff-diferenciar-campos-datetimes/

http://forum.imasters.com.br/topic/484930-strtotime-calculando-errado/?p=1925980

O outro tópico foi aberto devido um bug que deu no fórum, mas eu só mandei um mesmo, já aconteceu outras vezes, vou tirar um print e encaminhas pra vocês darem uma olhada se ocorrer novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilizando a classe DateTime, ele me retorna as horas em 00:00:00, não me trazendo a diferença. A minha consulta na base de dados não está correta ? Acho que essa é a grande falha do PHP, não ter um método eficaz de tratar diferenças entre datas, qualquer problema que venha a mexer com datas é uma trabalheira.

$data = mysql_fetch_assoc(mysql_query("SELECT inicio, fim WHERE cod_id='$cod_id' "));
 
if(isset($data)){
 
$d1 = new DateTime($data['fim']);
$d2 = new DateTime($data['inicio']);
}
$diff = $d2->diff($d1);
 
print_r($diff);

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema deve estar mais na consulta ou no formato dos dados que no cálculo.

Veja o exemplo abaixo:

$start = new \DateTime('10:00:00');
$end = new \DateTime('16:00:00');

$diff = $start->diff($end);

var_dump(diff);


Saída:

object(DateInterval)[3]
public 'y' => int 0
public 'm' => int 0
public 'd' => int 0
public 'h' => int 6
public 'i' => int 0
public 's' => int 0
public 'invert' => int 0
public 'days' => int 0


Contabilizou corretamente as 6 horas de diferença.

Caso queira utilizar em um formato específico:

$diff->format('%H:%S:%I');

Saída:

06:00:00

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz isso, e dá certo se eu fizer do mesmo jeito que você utilizando data fixa, porém, quando pego uma data do banco de dados não funciona e o que eu preciso é justamente calcular as datas do banco de dados, caso contrário, não terei a diferença correta, eu coloquei a query certinho, não mostra erro nem nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel fiz o que você falou e ele mostra a diferença entre as datas

Array ( [0] => 2015-04-29 17:29:51 [inicio] => 2015-04-29 17:29:51 [1] => 2015-04-29 17:30:15 [fim] => 2015-04-29 17:30:15 ) Warning: DateTime::createFromFormat() expects at least 2 parameters, 1 given in D:\inetpub\wwwroot\site\date_time.php on line 14 DateInterval Object ( [y] => 0 [m] => 0 [d] => 0 [h] => 0 => 0 => 24 [invert] => 0 [days] => 0 )

que é de 24 segundos, só que eu fiz o select assim :

$data = mysql_fetch_array(mysql_query("SELECT inicio, fim FROM tb_time_acionamento "));


daí ele só me mostra o primeiro id da tabela que este ai acima, caso eu inclua a cláusula "WHERE cod_id = '$cod_id'", ele já não mostra nada. E eu preciso inclui isso porque a diferença só pode ser calculada quando eu clicar no botão parar, vou ver se mando uma imagem pra ficar mais fácil de entender, acredito que agora seja alguma coisa simples de resolver.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Warning: DateTime::createFromFormat() expects at least 2 parameters, 1 given in D:\inetpub\wwwroot\site\date_time.php on line 14

Resolva esse erro. Está faltando o segundo parâmetro. Veja os exemplos no manual:

http://php.net/manual/en/datetime.createfromformat.php#refsect1-datetime.createfromformat-examples

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolva esse erro. Está faltando o segundo parâmetro. Veja os exemplos no manual:

http://php.net/manual/en/datetime.createfromformat.php#refsect1-datetime.createfromformat-examples

Resolvido o erro, agora ele exibe tudo certinho sem apresentar erros:

 

Array ( [0] => 2015-04-30 16:49:54 [inicio] => 2015-04-30 16:49:54 [1] => 2015-04-30 17:02:28 [fim] => 2015-04-30 17:02:28 ) 22/04/2013DateTime Object ( [date] => 2013-04-22 17:10:34 [timezone_type] => 3 [timezone] => America/Sao_Paulo ) object(DateTime)#1 (3) { ["date"]=> string(19) "2013-04-22 17:10:34" ["timezone_type"]=> int(3) ["timezone"]=> string(17) "America/Sao_Paulo" } DateInterval Object ( [y] => 0 [m] => 0 [d] => 0 [h] => 0 => 12 => 34 [invert] => 0 [days] => 0 )[/size]

 

o resultado acima ele me dá com este trecho de código:

 

$data = mysql_fetch_array(mysql_query("SELECT inicio, fim FROM tb_time_acionamento WHERE cod_id = 30"));
print_r($data);
$ret = DateTime::createFromFormat('Y-m-d', '2013-04-22');
echo $ret->format('d/m/Y');

eu coloquei a data 2013-04-22 como exemplo, se eu colocar a variável $data, ele dá aquele erro que falta um parâmetro. Este é um código que fiz a parte para tentar resolver, a função não reconhece a variavel $data que a variável que guardo o meu select e só aceita indice fixo, não está pegando por "where cod_id = '$cod_id'". O código da aplicação é este:

 

 
if(isset($_GET['parar'])){
  extract($_GET);
$cod_id = $_GET['indice'];
      $dataF = date('Y-m-d H:i:s');
      
$data1 = mysql_fetch_array(mysql_query("select inicio, fim from tb_time_acionamento where cod_id = '$cod_id'"))or die('Erro na consulta '.mysql_error());
$ret = DateTime::createFromFormat('Y-m-d', '2013-04-22');
echo $ret->format('d/m/Y');
//$data2 = mysql_fetch_array(mysql_query("select fim from tb_time_acionamento where cod_id = '$cod_id'"))or die('Erro na consulta '.mysql_error());
 
 
/*
 
$unix_data1 = strtotime($data1);
$unix_data2 = strtotime($data2);
 
$nHoras   = ($unix_data2 - $unix_data1) / 3600;
$nMinutos = (($unix_data2 - $unix_data1) % 3600) / 60;
 
$durac = $unix_data1;
$total = sprintf('%02d:%02d', $nHoras, $nMinutos);
*/
$recebe = mysql_fetch_array(mysql_query("SELECT TIMEDIFF(now(), inicio) 
FROM tb_time_acionamento;"));
 
 
  $upDados = "UPDATE tb_time_acionamento SET fim = '$dataF', status = 'Encerrado', total='".formataDataMysql($ret)."' WHERE cod_id = '$cod_id' AND total is NULL";
  
mysql_query($upDados) or die(' Erro ao realizar o update '.mysql_errno()); 
 
$vai ='acionamento_teste.php';
header('Location: '.$vai);
  }     

mas se eu imprimo a varável $ret ou $data1, a data exibida é 31/12/1969 21:00:00

 

tem que fazer mais algum tratamento ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro isso não é necessário

 
  extract($_GET);

Fazendo isso, você deixa seu código vulnerável, remova-o. Tudo deve ser recebido através da superglobal e seu respectivo índice, da forma que você abaixo é o corrreto:

 
 $cod_id = $_GET['indice'];

O código abaixo só dá erro pois o segundo parâmetro não foi inserido ou não foi definido, logo, o código abaixo, deve funcionar:

 
$ret = DateTime::createFromFormat('Y-m-d', $data);

mas se eu imprimo a varável $ret ou $data1, a data exibida é 31/12/1969 21:00:00

Esse é um erro do MySQL, qual o formato do campo de data no mysql?

 

 

------

PS.: Cuide com o bbcode de código é com colchetes e não chevrons

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro isso não é necessário

 

Fazendo isso, você deixa seu código vulnerável, remova-o. Tudo deve ser recebido através da superglobal e seu respectivo índice, da forma que você abaixo é o corrreto:

 

 
 $cod_id = $_GET['indice'];

O código abaixo só dá erro pois o segundo parâmetro não foi inserido ou não foi definido, logo, o código abaixo, deve funcionar:

 
$ret = DateTime::createFromFormat('Y-m-d', $data);

Esse é um erro do MySQL, qual o formato do campo de data no mysql?

 

 

------

PS.: Cuide com o bbcode de código é com colchetes e não chevrons

É formato do campo no mysql é datetime, já fiz esse tratamento, quanto ao trecho:

<code>

$ret = DateTime::createFromFormat('Y-m-d', $data);

</code>

 

Eu já fiz isso passando a variável do meu select, só que ele fala que está faltando parâmetro, ele só aceita seu colocar assim:

<code>

 

$ret = DateTime::createFromFormat('Y-m-d', '2013-04-22');

</code>

 

porém, isso não me serve pois tenho que passar para esta função a variável com meu select correto ? Eu olhei no manual php.net, fiz os exemplos iguaizinhos, porém, se eu passo uma variável ele não aceita.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É formato do campo no mysql é datetime, já fiz esse tratamento, quanto ao trecho:

<code>

$ret = DateTime::createFromFormat('Y-m-d', $data);

</code>

 

Eu já fiz isso passando a variável do meu select, só que ele fala que está faltando parâmetro, ele só aceita seu colocar assim:

<code>

 

$ret = DateTime::createFromFormat('Y-m-d', '2013-04-22');

</code>

 

porém, isso não me serve pois tenho que passar para esta função a variável com meu select correto ? Eu olhei no manual php.net, fiz os exemplos iguaizinhos, porém, se eu passo uma variável ele não aceita.

Coloquei assim Gabriel :

<code>

$ret = DateTime::createFromFormat('Y-m-d', "$data1");

 

</code>

 

coloquei entre aspas a minha variável com a consulta, ele parou de dar o erro mas ainda assim ele não imprime a diferença, está trazendo a data padrão do mysql. Já criei a função que formata a data para o padrão do mysql e está ok.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, muito obrigado pela ajuda, consegui resolver o problema utilizando este select no banco :

 

<code>

 

$rec = mysql_query("select inicio,fim, TIMEDIFF(fim, inicio) as total FROM tb_time_acionamento");

</code>

 

usando o timediff foi mais fácil, mesmo assim vou estudar cálculos de datas.

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.