Jump to content


Photo

Diferença Entre Datas


  • Faça o login para participar
22 replies to this topic

#1 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 18/12/2003, 22:21

Olá. Alguém sabe se o PHP tem alguma função para calcular a diferença entre datas? Algo como o DateDiff do ASP. Eu estou precisando calcular a diferença em minutos, dias e meses. Todos os exemplos até agora foram só usando timestamp. Mas como funciona esse negócio afinal? Se entendi bem, é a data, mas só com os números no formato aaaammddhhmmss é isso? Como se calcula com isso?

#2 kartesus

kartesus

    ich bin der Geist der stets verneint

  • Usuários
  • 210 posts
  • Sexo:Não informado
  • Localidade:Rio Grande do Sul
  • Interesses:PHP e sexo

Posted 19/12/2003, 00:49

Aê LeoB!!!
O timestamp unix (usado pelo php) é diferente do timestamp que o MySQL usa; o do MySQL é esse que tu disseste, o unix conta o número de segundos desde 1/1/1970 (inicio da era unix :yes: ) !! o legal de trabalhar com isso é que tu podes trabalhar com datas como se fossem inteiros (pode comparar, somar, subtrair, ...) e usar funções tipo date() pra formatar a exibição!!

uma funçãozinha date_diff () poderia ser assim:
function date_diff ($date1, $date2)
{
	$diff  = $date1 > $date2 ? $date1 - $date2 : $date2 - $date1;
	return $diff / 3600;
	
}


Esse lance é só matemática vélinho!!! a função retorna a diferença em horas, divide o $diff por 86400 pra ter a diferença em dias ;)
Ainda com dúvidas? Poste-as aki

#3 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 19/12/2003, 00:56

Poxa, mas o PHP com uma lista tão grande de funções bem que podia ter uma dessa já pronta... :(

Obrigado. :D

#4 kartesus

kartesus

    ich bin der Geist der stets verneint

  • Usuários
  • 210 posts
  • Sexo:Não informado
  • Localidade:Rio Grande do Sul
  • Interesses:PHP e sexo

Posted 19/12/2003, 01:15

é verdade...
Ainda com dúvidas? Poste-as aki

#5 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 19/12/2003, 12:17

Ops, eu estava fazendo a função. Consegui fazer a diferença entre hora, minuto, segundo e dias. Mas e por mês? Por que número eu divido já que é o número de dias no mês não é constante?

#6 kartesus

kartesus

    ich bin der Geist der stets verneint

  • Usuários
  • 210 posts
  • Sexo:Não informado
  • Localidade:Rio Grande do Sul
  • Interesses:PHP e sexo

Posted 20/12/2003, 02:41

eu pegaria um mes valendo 30 dias... fica um valor aproximado, mas fazer o q?!? de outra forma a função ia ficar lenta e eu acho q não valeria a pena!!
Ainda com dúvidas? Poste-as aki

#7 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 20/12/2003, 13:03

Olá. Pois é, usei 30 mesmo. Obrigado.

#8 luiz000

luiz000

    Expert

  • Banidos
  • PipPipPipPipPipPip
  • 530 posts
  • Sexo:Não informado

Posted 20/12/2003, 14:39

eu poderia usar este codigo pra descobrir a idade de alguem? tipo a primeira data seria o dia de hj, date("dmy") e a outra a data que o cara nasceu, daria certo?

#9 kartesus

kartesus

    ich bin der Geist der stets verneint

  • Usuários
  • 210 posts
  • Sexo:Não informado
  • Localidade:Rio Grande do Sul
  • Interesses:PHP e sexo

Posted 20/12/2003, 16:36

pega a diferença em anos!! não vejo pq não dar certo... faz um teste e posta como ficou!!
Ainda com dúvidas? Poste-as aki

#10 kartesus

kartesus

    ich bin der Geist der stets verneint

  • Usuários
  • 210 posts
  • Sexo:Não informado
  • Localidade:Rio Grande do Sul
  • Interesses:PHP e sexo

Posted 20/12/2003, 16:38

Ow LeoB... se tu fizeste a função podia postar o arkivinho com ela aki né??!! :D aí se alguém quiser modificar agente pode manter um lance legal disponível pra quem tá com problema com datas!!! (q é bastante gente!!!)
Ainda com dúvidas? Poste-as aki

#11 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 20/12/2003, 17:35

Boa idéia kartesus. Como é uma função pequena, nem vale a pena enviar o arquivo. Está aí embaixo:

function DataDif($Data1, $Data2, $Intervalo){
$Q = 1;
switch($Intervalo){
case 'm': $Q *= 30;
case 'd': $Q *= 24;
case 'h': $Q *= 60;
case 'n': $Q *= 60;
}
return intval((strtotime($Data2) - strtotime($Data1)) / $Q);
}

m é para mês, d para dia, h para hora, n para minuto e qualquer outro valor para segundo.

#12 luiz000

luiz000

    Expert

  • Banidos
  • PipPipPipPipPipPip
  • 530 posts
  • Sexo:Não informado

Posted 20/12/2003, 18:22

vai ser meio dificil, eu nao sei muito bem como fazer, e meu php nao ta funfanfo de jeito nenhum,
se alguem ude rfazer pra mim!!!

#13 kartesus

kartesus

    ich bin der Geist der stets verneint

  • Usuários
  • 210 posts
  • Sexo:Não informado
  • Localidade:Rio Grande do Sul
  • Interesses:PHP e sexo

Posted 20/12/2003, 20:15

function DataDif($Data1, $Data2, $Intervalo){
	
switch($Intervalo){
case 'm' : $Q = 2592000; break; //mes
case 'd' : $Q = 86400; break;   //dia
case 'h' : $Q = 3600; break;    //hora
case 'n' : $Q = 60; break;      //minuto
default  : $Q = 1; break;       //segundo
}
return round ((strtotime($Data2) - strtotime($Data1)) / $Q);
}
Aê LeoB ... vou explicar as mudanças q eu fiz no teu código!!

1) acho q o default no switch fica mais legivel e mais facil de entender pq ele é 1;
2) tu tinha esquecido os breaks!!
3) tu tnha posto valores errados pra divisão (Matemática rapaz!!);
4) achei o round() mais adequado q o intval();

Quaquer duvida ou critica postem!!
Ainda com dúvidas? Poste-as aki

#14 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 20/12/2003, 20:35

Olá. Não, eu não errei kartesus. Só usei uma lógica diferente. Pense comigo:

function DataDif($Data1, $Data2, $Intervalo){
$Q = 1;
switch($Intervalo){
case 'm': $Q *= 30;
case 'd': $Q *= 24;
case 'h': $Q *= 60;
case 'n': $Q *= 60;
}
return intval((strtotime($Data2) - strtotime($Data1)) / $Q);
}


Preste atenção que eu usei *=. Inicialmente $Q é 1. Se o intervalo for 'm', então ele cai no case 'm' e continua por que não tem break. Daí vai multiplicando $Q por 30,24,60,60 que no final dá: 2592000. Se fosse 'd', ele cairia no case 'd' e multiplicaria por 24,60,60 que dá: 86400. Se for 'h', por 60,60 que dá 3600 e se for 'n' por 60 que dá 60. Qualquer outro valor não cairia em canto nenhum do switch e $Q continuaria sendo 1. Entendeu? Quanto ao round, nada contra, mas eu prefiro o intval mesmo. ;)

#15 kartesus

kartesus

    ich bin der Geist der stets verneint

  • Usuários
  • 210 posts
  • Sexo:Não informado
  • Localidade:Rio Grande do Sul
  • Interesses:PHP e sexo

Posted 20/12/2003, 20:45

Boa.... de qualquer modo, a legibilidade do código ficava prejudicada no meu ver!!

Mas melhor assim... duas opções pra quem precisar!! hehehe
Ainda com dúvidas? Poste-as aki




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq