Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ola, desculpem porque essa é bem dificil pro meu nivel.
Estou usando uma class (que funciona) para calcular a diferença entre data de hoje e uma data/hora registrada no DB.
O problema é que a data/hora do DB é em um formato diferente.
Por favor, se alguém exerga onde estou errando em formatar essa data porque o calculo sai errado.
// verifica que dia e hora é
$Rst = mysql_query("SELECT startdate, starttime FROM requests WHERE id = '$id'");
while($valor=mysql_fetch_row($Rst)){
echo 'data completa: '.$valor[0].$valor[1].'<br>';
$datainiciodb = $valor[0]+$valor[1];
//modifico formato data
$datafmt = date('d/m/Y H:i:s', strtotime($datainiciodb));
echo $datafmt;
}
//verifica a data
$obj = new CalcDataHora();
$datahj = $obj->getData()." ".$obj->getHora();
echo $datahj;
$difdata = $obj->difDataHora($datahj, $datafmt,"h");
//echo $obj->difDataHora("22/06/2010 07:48:45", "22/06/2010 20:26:00","h");
if ($difdata > 0){//se ainda nao é hoje
echo "Voce esta muito adiantado! Ainda faltam $difdata hora(s).";
}
O retorno $difdata esta dando 20 horas quando a diferença (20-7) deveria ser 13 :S
Além disso a hora no DB é 16:30:00 e quando formato retorna 20:26:00
Alguém entende onde esta a bagunça?
Obrigada
Ai vai a class pra quem quiser dar uma olhada.
<?
// *
// * @author Andre Lourenco Pedroso - alp.pedroso@gmail.com
// *
// * @date 15 de Janeiro de 2007
// *
/**
*
* - Manipulacao de Data ou Hora.
*
* Operacoes: soma DIA, MES ,ANO, HORA, MINUTOS, SEGUNDOS.
* Formatos :
* Data: 15/01/2007
* Hora: 10:35:00
* Para subtrair, basta passar um valor negativo:
* Ex:
* $obj->somaDia(-10);
*
* - Calcula diferenca entre duas datas.
*
* Operacoes: difDataHora.
* Formatos :
* Data: 15/01/2007 10:35:00
* E necessario passar duas datas como parametro e o tipo de retorno desejado:
* Ex:
* $obj->difDataHora($dataMenor,$dataMaior,"m");
*
*/
class CalcDataHora
{
private $data;
private $hora;
function CalcDataHora($data="",$hora="")
{
if($hora=="")
{
$hora = date("H:i:s");
}
if($data=="")
{
$data = date("d/m/Y ");
}
else if ($this->validaData($data,"d"))
{
die ("Padrao de data ($data) invalido! - Padrao = 15/01/2007");
}
$this->data = explode("/",$data);
$this->hora = explode(":",$hora);
}
private function validaData($data,$op)
{
switch($op)
{
case "d": // Padrao: 15/01/2007
$er = "(([0][1-9]|[1-2][0-9]|[3][0-1])\/([0][1-9]|[1][0-2])\/([0-9]{4}))";
if(ereg($er,$data))
{
return 0;
}
else
{
return 1;
}
break;
case "dh": // Padrao 15/01/2007 10:30:00
$er = "(([0][1-9]|[1-2][0-9]|[3][0-1])\/([0][1-9]|[1][0-2])\/([0-9]{4})*)";
if(ereg($er,$data))
{
return 0;
}
else
{
return 1;
}
break;
}
}
// DATA
public function somaDia($dias=1)
{
$this->CalcDataHora(strftime("%d/%m/%Y", mktime(0, 0, 0, $this->data[1], $this->data[0]+$dias, $this->data[2])),"");
return $this->data;
}
public function somaMes($meses=1)
{
$this->CalcDataHora(strftime("%d/%m/%Y", mktime(0, 0, 0, $this->data[1]+$meses, $this->data[0], $this->data[2])),"");
return $this->data;
}
public function somaAno($anos=1)
{
$this->CalcDataHora(strftime("%d/%m/%Y", mktime (0, 0, 0, $this->data[1], $this->data[0], $this->data[2]+$anos)),"");
return $this->data;
}
public function getData()
{
return $this->data[0]."/".$this->data[1]."/".$this->data[2];
}
// HORA
public function somaSegundo($segundos=1)
{
$this->CalcDataHora("",strftime("%H:%M:%S",mktime($this->hora[0],$this->hora[1],$this->hora[2]+$segundos, 0, 0, 0)));
return $this->hora;
}
public function somaMinuto($minutos=1)
{
$this->CalcDataHora("",strftime("%H:%M:%S",mktime($this->hora[0],$this->hora[1]+$minutos,$this->hora[2], 0, 0, 0)));
return $this->hora;
}
public function somaHora($horas=1)
{
$this->CalcDataHora("",strftime("%H:%M:%S",mktime($this->hora[0]+$horas,$this->hora[1],$this->hora[2], 0, 0, 0)));
return $this->hora;
}
public function getHora()
{
return $this->hora[0].":".$this->hora[1].":".$this->hora[2];
}
/**
*
* Retorna diferença entre as datas em Dias, Horas ou Minutos
* Function difDataHora(data menor, [data maior],[dias horas minutos segundos])
*
* Formato 04/05/2006 12:00:00
*
* Chame a funcao com o valor NULL como 'data maior' para 'data maior' = data atual.
*
* Formatacao do retorno [dias horas minutos segundos]:
*
* "s": Segundos
* "m": Minutos
* "H": Horas
* "h": Horas arredondada
* "D": Dias
* "d": Dias arredontados
*
* Original: Gambiarra.com.br Bozo@gambiarra.com.br
*
* Modificado: Andre Lourenco Pedroso alp.pedroso@gmail.com
* Data 15/01/2007 10:00
*/
public function difDataHora($datamenor,$datamaior="",$tipo="")
{
if($this->validaData($datamenor,"dh"))
{
die ("data errada - $datamenor");
}
if($datamaior==""){
$datamaior = date("d/m/Y H:i:s");
}
if($tipo==""){
$tipo = "h";
}
list ($diamenor, $mesmenor, $anomenor, $horamenor, $minutomenor, $segundomenor) = split("[/: ]",$datamenor);
list ($diamaior, $mesmaior, $anomaior, $horamaior, $minutomaior, $segundomaior) = split("[/: ]",$datamaior);
$segundos = mktime((int)$horamaior,(int)$minutomaior,(int)$segundomaior,(int)$mesmaior,(int)$diamaior,(int)$anomaior)-mktime((int)$horamenor,(int)$minutomenor,(int)$segundomenor,(int)$mesmenor,(int)$diamenor,(int)$anomenor);
switch($tipo){
case "s": // Segundo
$diferenca = $segundos;
break;
case "m": // Minuto
$diferenca = $segundos/60;
break;
case "H": // Hora
$diferenca = $segundos/3600;
break;
case "h": // Hora Arredondada
$diferenca = round($segundos/3600);
break;
case "D": // Dia
$diferenca = $segundos/86400;
break;
case "d": // Dia Arredondado
$diferenca = round($segundos/86400);
break;
}
return $diferenca;
}
}
?>>
Bom dia,
Creio que este artigo seja de grande ajuda.
Um exemplo simples de como calcular a diferença entre 2 datas utilizando o php, como bem sabemos um dia possui 24 horas que equivale a (24 60 60) igual á 86400.
A função mktime recebe os argumentos (hora, minuto, segundos, mes, dia, ano).
<?php
#setando a primeira data 10/01/2008
$dia1 = mktime(0,0,0,01,10,2008);
#setando segunda data 10/02/2008
$dia2 = mktime(0,0,0,02,10,2008);
#armazenando o valor da subtracao das datas
$d3 = ($dia2-$dia1);
#usando o roud para arrendondar os valores
#converter o tempo em dias
$dias = round(($d3/60/60/24));
#converter o tempo em horas
$hrs = round(($d3/60/60));
#converter o tempo em minutos
$mins = round(($d3/60));
#exibindo dias | reproduzira na tela 31
echo $dias.”<br>”;echo $hrs.”<br>”;echo $mins.”<br>”;
?>
Importante lembrar que acima hrs é o total de horas entre as duas datas e o mesmo para minutos.
Para tornar o exemplo útil você precisa setar de forma dinâmica os valores para $dia1 e $dia2, como exemplo imagine que seu sistema grava a data (mktime) de um post e faça o calculo do (diaAtual – diadoPost).
Dica:
Para passar para o formato comum uma data em mktime() use o date como abaixo:
echo date(‘d/m/Y’,$dia2);
FONTE: http://clares.wordpress.com/2008/02/10/calculando-a-diferenca-entre-2-datas/
Espero que ajude.
Ola Angelorubin,
Muito obrigada pela resposta! Daria pra voce por favor me dar um exemplo mais pratico de como eu posso usar isso pra formatar a data?
Todo o meu problema esta aqui:
$Rst = mysql_query("SELECT startdate, starttime FROM requests WHERE id = '$id'");
while($valor=mysql_fetch_row($Rst)){
echo 'data completa: '.$valor[0].$valor[1].'<br>';
$datainiciodb = $valor[0]+$valor[1];
//modifico formato data
$datafmt = date('d/m/Y H:i:s', strtotime($datainiciodb));
echo $datafmt;
}
Eu preciso concatenar os dois campos do DB e ao mesmo tempo converter o formato YY-mm-dd para o mesmo formato da minha classe dd/mm/YY pra poder funcionar a comparaçao!
Eu nem sei oque se faz primeiro, eu converto primeiro ou concateno primeiro?
Me da uma ajuda?
Obrigada!
To fazendo assim agora:
// verifica que dia e hora é a consulta
//seleciono primeiro a data
$data = mysql_query("SELECT startdate FROM jos_sv_apptpro_requests WHERE id = '$id'")or die(mysql_error());
while ($row = mysql_fetch_assoc($data)) {
$dataini = $row["startdate"];
$datafmt = date('d/m/Y', strtotime($dataini));
}
//selecione a hora
$hora = mysql_query("SELECT starttime FROM jos_sv_apptpro_requests WHERE id = '$id'")or die(mysql_error());
while ($row = mysql_fetch_assoc($hora)) {
$horaini = $row["starttime"];
}
//concateno?
$datahoradb = $datafmt." ".$horaini;
echo $datahoradb;
//verifica a data
$obj = new CalcDataHora();
$datahj = $obj->getData()." ".$obj->getHora();
echo $datahj;
$difdata = $obj->difDataHora($datahj, $datahoradb,"h");
echo $obj->difDataHora("22/06/2010 09:13:00", "22/06/2010 16:30:00","h");
if ($difdata > "0"){//se ainda nao é hoje
echo "Voce esta muito adiantado! Ainda faltam $difdata hora(s) para a sua consulta.";
}
A data do DB agora vem certa, mas a conta da errado! Ele diz que faltam 16 horas invez de 7.
No echo que eu dei pra ver o retorno da class com exatamente os valores que retornam da variavel a conta vem certa, ou seja 7.
Ou seja: chamo a classe pra fazer a diferença entre as variavéis da errado, se copio o valor das variavéis e faço a conta da certo!!!
Alguma luz? to pra ficar doida :)
Morgana,
Você precisa fazer as modificações antes de concatenar.
Tenta assim:
$data = explode("-",$valor['startdate']);
$data_invertida = ($data[2]."-".$data[1]."-".$data[0]);
$junta_data_hora = $data_invertida."-".$valor['starttime'];
echo $junta_data_hora;
Espero que ajude.
PHP >= 5.3.0
$date1 = new DateTime( '2010-12-24 20:01:56' );
$date2 = new DateTime( '2009-06-20 12:00:01' );
var_dump( $date1->diff( $date2 ), $date2->diff( $date1 ) );
object(DateInterval)#3 (8) {
["y"]=>
int(1)
["m"]=>
int(6)
["d"]=>
int(4)
["h"]=>
int(8)
["i"]=>
int(1)
["s"]=>
int(55)
["invert"]=>
int(1)
["days"]=>
int(6015)
}
object(DateInterval)#4 (8) {
["y"]=>
int(1)
["m"]=>
int(6)
["d"]=>
int(4)
["h"]=>
int(8)
["i"]=>
int(1)
["s"]=>
int(55)
["invert"]=>
int(0)
["days"]=>
int(6015)
}
Bom dia,
Creio que este artigo seja de grande ajuda.
Um exemplo simples de como calcular a diferença entre 2 datas utilizando o php, como bem sabemos um dia possui 24 horas que equivale a (24 60 60) igual á 86400.
A função mktime recebe os argumentos (hora, minuto, segundos, mes, dia, ano).
<?php
#setando a primeira data 10/01/2008
$dia1 = mktime(0,0,0,01,10,2008);
#setando segunda data 10/02/2008
$dia2 = mktime(0,0,0,02,10,2008);
#armazenando o valor da subtracao das datas
$d3 = ($dia2-$dia1);
#usando o roud para arrendondar os valores
#converter o tempo em dias
$dias = round(($d3/60/60/24));
#converter o tempo em horas
$hrs = round(($d3/60/60));
#converter o tempo em minutos
$mins = round(($d3/60));
#exibindo dias | reproduzira na tela 31
#exibindo horas | reproduzira na tela 744
#exibindo minutos | reproduzira na tela 44640
Importante lembrar que acima hrs é o total de horas entre as duas datas e o mesmo para minutos.
Para tornar o exemplo útil você precisa setar de forma dinâmica os valores para $dia1 e $dia2, como exemplo imagine que seu sistema grava a data (mktime) de um post e faça o calculo do (diaAtual – diadoPost).
Dica:
Para passar para o formato comum uma data em mktime() use o date como abaixo:
echo date(‘d/m/Y’,$dia2);
FONTE: http://clares.wordpress.com/2008/02/10/calculando-a-diferenca-entre-2-datas/
Espero que ajude.