Obtenha a diferença entre duas épocas (Unix Epoch)
Pergunta
Sabe quando é tarde da noite e seu cérebro está frito?Estou tendo uma dessas noites agora e minha função até agora não está funcionando como deveria, então dê uma olhada:(Devo observar que estou usando o PHP 5.2.9, e a função/método DataHora:Diff() não está disponível até o PHP 5.3.0.
<?php
function time_diff($ts1, $ts2) {
# Find The Bigger Number
if ($ts1 == $ts2) {
return '0 Seconds';
} else if ($ts1 > $ts2) {
$large = $ts1;
$small = $ts2;
} else {
$small = $ts1;
$large = $ts2;
}
# Get the Diffrence
$diff = $large - $small;
# Setup The Scope of Time
$s = 1; $ss = 0;
$m = $s * 60; $ms = 0;
$h = $m * 60; $hs = 0;
$d = $h * 24; $ds = 0;
$n = $d * 31; $ns = 0;
$y = $n * 365; $ys = 0;
# Find the Scope
while (($diff - $y) > 0) { $ys++; $diff -= $y; }
while (($diff - $n) > 0) { $ms++; $diff -= $n; }
while (($diff - $d) > 0) { $ds++; $diff -= $d; }
while (($diff - $h) > 0) { $hs++; $diff -= $h; }
while (($diff - $m) > 0) { $ms++; $diff -= $m; }
while (($diff - $s) > 0) { $ss++; $diff -= $s; }
# Print the Results
return "$ys Years, $ns Months, $ds Days, $hs Hours, $ms Minutes & $ss Seconds.";
}
// Test the Function:
ediff(strtotime('December 16, 1988'), time());
# Output Should be:
# 20 Years, 11 Months, 8 Days, X Hours, Y Minutes & Z Seconds.
?>
Solução
Que tal agora:
function time_diff($t1, $t2)
{
$totalSeconds = abs($t1-$t2);
$date = getdate($totalSeconds);
$firstYear = getdate(0);
$years = $date['year']-$firstYear['year'];
$months = $date['mon'];
$days = $date['mday'];
$hours = $date['hour'];
$minutes = $date['minutes'];
$seconds = $date['seconds'];
return "$years Years, $months Months, $days Days, $hours Hours, $minutes Minutes & $seconds Seconds.";
}
Isso usa a diferença dos tempos fornecidos como data. Então você pode deixar o "GetDate" fazer todo o trabalho para você. O único desafio é o número de anos - que é simplesmente o ano GetDate (da diferença) menos o ano da Epoch Unix (1970).
Se você não gosta de usar um mês real, também pode dividir o dia do "ano" pelo número de dias em 12 meses iguais
$months = $date['yday'] / (365/12);
Da mesma forma, dias poderiam ser descobertos os dias restantes com módulo
$days = $date['yday'] % (365/12);
Outras dicas
Esta não é uma resposta para sua pergunta, mas eu só queria ressaltar ...
while (($diff - $y) > 0) { $ys++; $diff -= $y; }
é uma maneira muito ineficiente de escrever
$ys = $diff / $y;
$diff = $diff % $y;
Além disso, isso
else if ($ts1 > $ts2) {
$large = $ts1;
$small = $ts2;
} else {
$small = $ts1;
$large = $ts2;
}
# Get the Diffrence
$diff = $large - $small;
pode ser facilmente reescrito como
$diff = abs($ts1 - $ts2);
Tenho a sensação de que o problema do seu código seria mais aparente se fosse menos detalhado. :)
que tal simplificar a primeira parte com um simples
$diff = abs($ts2 - $ts1);
Então, quando você fizer isso:
$n = $d * 31; $ns = 0;
$y = $n * 365; $ys = 0;
na verdade, você está dizendo que um ano é composto por 365 meses de 31 dias.o que na verdade é cerca de 36 anos.Provavelmente não é o que você deseja.
Finalmente, somos todos adultos aqui.Por favor, use nomes de variáveis adultos, ou seja,$YEAR_IN_SECONDS em vez de $ys.Como você pode ver claramente, você pode escrever código uma vez, mas outros 20 idiotas terão que lê-lo muitas vezes.
No caso de necessidade de todos os meses durante o dado times-stamp, temos o uso da seguinte codificação no PHP:
function MonthsBetweenTimeStamp($t1, $t2) {
$monthsYear = array();
$lastYearMonth = strtotime(gmdate('F-Y', $t2));
$startYearMonth = strtotime(gmdate('F-Y', $t1));
while ($startYearMonth < $lastYearMonth) {
$monthsYear[] = gmdate("F-Y", $startYearMonth);
//Increment of one month directly
$startYearMonth = strtotime(gmdate("F-Y", $startYearMonth) . ' + 1 month');
}
if (empty($monthsYear)) {
$monthsYear = array($startYearMonth));
}
return $monthsYear;