Diferença Entre Datas
Started By LeoB, 18/12/2003, 22:21
22 replies to this topic
#1
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
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 ) !! 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:
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
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 ) !! 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
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.
Obrigado.
#5
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?
#7
Posted 20/12/2003, 13:03
Olá. Pois é, usei 30 mesmo. Obrigado.
#8
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?
#11
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.
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
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!!!
se alguem ude rfazer pra mim!!!
#13
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
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.
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.
1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)