2010-12-09 9 views
3

Sagen, ich habe die folgenden zwei Tage, ein Startdatum und Enddatum:PHP Zeitberechnung

   Year-Month-Day Hours:Minutes:Seconds 

Start Date: 2010-12-03 14:04:41 
Expiry Date: 2010-12-06 12:59:59 

Wie kann ich, mit PHP die beiden Daten subtrahieren und mit so etwas wie gelassen werden:

Difference : -3 Tage, 2 Minuten und 18 Sekunden (wenn das Ablaufdatum beispielsweise 3 Tage zurückliegt).

Antwort

4

Dies basiert auf zahlreichen Online-Beispielen; Sie werden überall einen ähnlichen Code sehen, wenn Sie Google googeln.

function timeSince($dateFrom, $dateTo) { 
    // array of time period chunks 
    $chunks = array(
     array(60 * 60 * 24 * 365 , 'year'), 
     array(60 * 60 * 24 * 30 , 'month'), 
     array(60 * 60 * 24 * 7, 'week'), 
     array(60 * 60 * 24 , 'day'), 
     array(60 * 60 , 'hour'), 
     array(60 , 'minute'), 
    ); 

    $original = strtotime($dateFrom); 
    $now  = strtotime($dateTo); 
    $since = $now - $original; 
    $message = ($now < $original) ? '-' : null; 

    // If the difference is less than 60, we will show the seconds difference as well 
    if ($since < 60) { 
     $chunks[] = array(1 , 'second'); 
    } 

    // $j saves performing the count function each time around the loop 
    for ($i = 0, $j = count($chunks); $i < $j; $i++) { 

     $seconds = $chunks[$i][0]; 
     $name = $chunks[$i][1]; 

     // finding the biggest chunk (if the chunk fits, break) 
     if (($count = floor($since/$seconds)) != 0) { 
      break; 
     } 
    } 

    $print = ($count == 1) ? '1 ' . $name : $count . ' ' . $name . 's'; 

    if ($i + 1 < $j) { 
     // now getting the second item 
     $seconds2 = $chunks[$i + 1][0]; 
     $name2 = $chunks[$i + 1][1]; 

     // add second item if it's greater than 0 
     if (($count2 = floor(($since - ($seconds * $count))/$seconds2)) != 0) { 
      $print .= ($count2 == 1) ? ', 1 ' . $name2 : ', ' . $count2 . ' ' . $name2 . 's'; 
     } 
    } 
    return $message . $print; 
} 

Es war beabsichtigt, den Unterschied zwischen einer bestimmten Zeit und der aktuellen Zeit zu zeigen, aber ich habe leichte Änderungen stattdessen die Differenz zwischen zwei mal zu zeigen. Möglicherweise möchten Sie die Ausgabe von einem Postfix von "vor" zu einem Präfix von "Differenz:" ändern.

+0

Danke El Yobo: leider bekomme ich einen fatalen Fehler: Schwerwiegender Fehler: Kann nicht wieder deklarieren seit() (zuvor in/usr/local/pem/vhosts/103503/webspace/httpdocs/clients/wp-content/themes/discount deklariert -codes/page-ending-bald.php: 34) in /usr/local/pem/vhosts/103503/webspace/httpdocs/clients/wp-content/themes/discount-codes/page-ending-soon.php on line 34 –

+0

Ha, es sieht so aus, als ob Sie entweder bereits eine Funktion mit demselben Namen haben (in diesem Fall benennen Sie einfach meine Funktion in etwas anderes um) oder Sie fügen die Datei mit der darin enthaltenen Funktion mehr als einmal ein (in diesem Fall verwenden Sie 'include_once' anstelle von' include'). –

+0

Mein schlecht, war in einer Schleife :) - Funktioniert fast perfekt! Nur eine Sache, alle Ergebnisse kehren "vor" zurück. Zum Beispiel: "vor 1 Woche". Obwohl das vor 1 Woche 1 Woche in der Zukunft sein sollte? –

6

http://www.php.net/manual/en/datetime.diff.php

<?php 
$datetime1 = date_create('2009-10-11'); 
$datetime2 = date_create('2009-10-13'); 
$interval = date_diff($datetime1, $datetime2); 
echo $interval->format('%R%d days'); 
//result will be +2 days 
?> 

Ich hoffe, dass ist das, was Sie suchen.

+0

Das funktioniert, wenn du nur Tage willst, aber nicht die Details, die das OP verlangt. –

+1

Echo $ Intervall-> Format ('% R% d Tage,% I Minuten und% s Sekunden.'); –

+0

Danke eine Million lves, Meine PHP-Version unterstützt diesen Code noch nicht, aber es ist wirklich elegant und einfach zu lesen! –