Frage

Sie wissen, wenn es spät in der Nacht und Ihr Gehirn wird gebraten? Ich habe eine dieser Nächte, gerade jetzt, und meine Funktion bisher nicht funktioniert, wie es sollte, so nehmen Sie bitte einen Blick auf sie: (Ich sollte anmerken, dass ich mit der PHP 5.2.9 und die Funktion / Methode Datetime: Diff. () bis PHP 5.3.0 nicht verfügbar ist

<?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.
?>
War es hilfreich?

Lösung

Wie wäre es damit:

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.";
}

Hier wird die Differenz der angegebenen Zeiten als Datum. Dann können Sie lassen die „getDate“ alles tun, die Arbeit für Sie. Die einzige Herausforderung ist die Anzahl Jahre -., Die einfach das getdate Jahr (der Differenz) minus das Unix-Epoche Jahr (1970)

Wenn Sie nicht wie ein tatsächlichen Monat verwenden, können Sie auch teilen den „Jahr“ Tag durch die Anzahl der Tage in 12 gleichem Monat

$months = $date['yday'] / (365/12);

In ähnlichen Tage, um die verbleibenden Tage heraus mit Modul werden könnten

$days = $date['yday'] % (365/12);

Andere Tipps

Das ist keine Antwort auf Ihre Frage, aber ich wollte nur darauf hinweisen, ...

while (($diff - $y) > 0) { $ys++; $diff -= $y; }

ist eine sehr ineffiziente Art und Weise des Schreibens

$ys = $diff / $y;
$diff = $diff % $y;

Auch dies

       else if ($ts1 > $ts2) {
                $large = $ts1;
                $small = $ts2;
        } else {
                $small = $ts1;
                $large = $ts2;
        }
        # Get the Diffrence
        $diff = $large - $small;

kann so einfach neu geschrieben werden

$diff = abs($ts1 - $ts2);

Ich habe das Gefühl, dass das Problem in Ihrem Code wäre deutlicher, wenn sie weniger ausführlich sind. :)

Wie wäre es den ersten Teil mit einem einfachen Vereinfachung

$diff = abs($ts2 - $ts1);

Dann, wenn Sie dies tun:

 $n = $d * 31;   $ns = 0;
 $y = $n * 365;  $ys = 0;

Sie sagen tatsächlich, dass ein Jahr 365 31 Tage lang Monate bestehen. das ist eigentlich über 36 Jahre lange Jahre. Wahrscheinlich nicht, was Sie wollen.

Schließlich sind wir alle Erwachsenen hier. Bitte verwenden Sie erwachsen Variablennamen d $ YEAR_IN_SECONDS statt $ ys. Wie man deutlich sehen kann, können Sie Code nur einmal schreiben, aber 20 andere Schmuck gehen zu müssen, ihm eine Menge Zeit zu lesen.

Im Fall benötigt alle Monate während der angegebenen Zeiten Tempel dann haben wir Verwendung der folgenden Codierung in 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; 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top