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.
?>
Foi útil?

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; 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top