2016-04-02 11 views
2

Ich rufe einige Daten aus einer einfachen SELECT-Abfrage, wo die Zeile drei Felder enthält, , end_time(DATETIME) & reopen_time(DATETIME).Berechnung der Zeit zwischen DATETIME mit PHP

Ich versuche, die Zeit zwischen trainieren sowohl den start_time und end_time & auch zwischen den start_time & reopen_time, ob dies ein Fall ist. Die Art, wie ich gehe, ist complete durch eine andere Spalte bestimmen genannt, die entweder den Wert 1 setzt oder 0. Es wird die start_time und end_time wenn der gesamte Wert 1 und start_time und reopen_time wird Wert ist 0.

berechnen Jetzt sieht mein PHP wie folgt aus: Ich suche jemand von Gehäuse und Auge zu helfen:

$id=$_GET['id']; //this grabs the id from the previous page depending on which task is clicked. 
$sql = "SELECT * FROM to_do_list WHERE id=$id"; 
$result = mysqli_query($db, $sql); 

if(mysqli_num_rows($result) > 0){ 
    while($row = mysqli_fetch_assoc($result)){  
     $date1 = $row["start_time"];   
     $date2 = $row["end_time"];    
     $diff = abs(strtotime($date2) - strtotime($date1));    
     $years = floor($diff/(365*60*60*24)); 
     $months = floor(($diff - $years * 365*60*60*24)/(30*60*60*24)); 
     $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));    
     printf("%d years, %d months, %d days\n", $years, $months, $days);    
    } 
} else { 
    echo "There are no tasks!"; 
} 

Nun wird das Ergebnis, das ich zurück ist erhalten: 0 Jahre, 0 Monate, 0 Tage, aber es ist kein Fehler. Ich nehme an, das Format der Daten aus der Datenbank ist vielleicht falsch?

+0

Haben Sie den Inhalt des überprüfen '$ date1',' $ date2' usw. Variablen in einem Debugger? – RhinoDevel

+0

beide Inhalte geben mir das erwartete Ergebnis, aber von '2016-04-02 19: 48' &' 2016-04-02 19: 55: 20', die die Inhalte der Felder in der Datenbank sind. – PhpDude

+0

Sie wissen, dass Sie das Diff direkt in der MySQL-Abfrage mit 'DATEDIFF' können? –

Antwort

1

Ich würde einige Zeit (siehe das Wortspiel?) Einen Blick auf die PHP-Klasse DateTime (http://php.net/manual/en/class.datetime.php) nehmen.

Diese Klasse verfügt bereits über eine integrierte Methode, um den Unterschied zwischen Daten einschließlich Fällen wie Schaltjahren zu berücksichtigen und ein Objekt DataInterval zu erstellen. Dann mit dem DataInterval Objekt, das Sie formatieren können und ausziehbares die Stücke, die Sie wünschen (Monate, Tage, Jahre, etc ...)

while($row = mysqli_fetch_assoc($result)){  
    $date1 = $row["start_time"];   
    $date2 = $row["end_time"];  
    $datetime1 = new DateTime($date1); 
    $datetime2 = new DateTime($date2); 
    $interval = $datetime1->diff($datetime2); 
    echo $interval->format('%y years, %m months, %d days');  
} 

Hinweis: Wenn die $date1 und $date2 Felder genau gleich sind, erhalten Sie und Intervall, das 0 für Monate, Jahre usw. meldet ... da es keinen zeitlichen Unterschied gibt.

Auch beachten Sie, weil DateInterval Variationen wie Schaltjahre berücksichtigt, müssen Sie nicht vergessen, nicht jeden 'Monat' ist gleich. Wenn Sie genaue Tage Unterschied wissen müssen, bietet DateInterval eine öffentliche Eigenschaft days:

$date1 = new DateTime('2015-02-27'); // 2015 was a 'regular' year, Feb had 28 days 
$date2 = new DateTime('2015-03-27'); 
$interval_1_2 = $date1->diff($date2); 

$date3 = new DateTime('2016-02-27'); // 2016 was a 'leap' year, Feb had 29 days 
$date4 = new DateTime('2016-03-27'); 
$interval_3_4 = $date3->diff($date4); 

echo $interval_1_2->format('%m months, %d day '); // 1 month 0 days 
echo "Total Days: ".$interval_1_2->days."\n"; // 28 days 

echo $interval_3_4->format('%m months, %d day'); // 1 month 0 days 
echo "Total Days: ".$interval_3_4->days."\n"; // 29 days 

Erste Regel von Dev-Club: Das Rad nicht neu erfinden, es sei denn:

  1. Sie nicht tun kümmern sich um Funktionalität und experimentieren nur mit Problemen, die viele, viele Male zuvor für eine Art von Lernexperiment gelöst wurden.
  2. und bereit, wahrscheinlich mit einem schrulligen Ergebnis enden, die 100% Anwendungsfälle nicht ganz abdecken.
  3. Einfach Spaß haben.
+0

Hey Ray, danke, dass du dir die Zeit genommen hast, eine Antwort zu geben, ich bin immer noch ein wenig verwirrt, was ich falsch gemacht habe oder ist gibt es eine viel bessere Methode? Oder sagst du das oben genannte? – PhpDude

+0

@Dan, Sie versuchen, Datumsstrings in Zahlen zu konvertieren, um den Unterschied in Tagen, Monaten, Jahren zu berechnen. Es gibt bereits eine Methode, um das Zeug zu verwenden, anstatt Ihre eigene benutzerdefinierte Implementierung zu beheben. – Ray

+0

@Dan Ich bearbeitete mein Beispiel zu "echo" aus der exakten Zeichenfolge, die Sie versuchen, "printf"; – Ray

1

Man könnte dies tatsächlich tun direkt in mysql mit TIMESTAMPDIFF

$id= filter_input(INPUT_GET, 'id',FILTER_VALIDATE_INT); 
//crude sql injection filter, dont use in production 

$sql = " 
    SELECT *, 
    TIMESTAMPDIFF(YEAR, start_time , end_time) as years, 
    TIMESTAMPDIFF(MONTH, start_time , end_time) as months, 
    TIMESTAMPDIFF(DAY, start_time , end_time) as days 
    FROM to_do_list WHERE id=$id 
"; 

$result = mysqli_query($db, $sql); 

if(mysqli_num_rows($result) > 0){ 
    while($row = mysqli_fetch_assoc($result)){  
     $date1 = $row["start_time"];   
     $date2 = $row["end_time"];    
     $years = $row["years"];   
     $months = $row["months"];   
     $days = $row["days"];   

     printf("%d years, %d months, %d days\n", $years, $months, $days);    
    } 
} else { 
    echo "There are no tasks!"; 
} 

sehen diese answer für Informationen darüber, wie SQL-Injection-Prävention richtig behandeln

+0

Dies gibt mir immer noch das gleiche Ergebnis von '0 Jahre, 0 Monate, 0 Tage' – PhpDude

+2

was echo" $ date1 $ date2 ";' geben? – andrew

+0

Es gibt: '2016-04-02 19:48:04 2016-04-02 19: 55: 20' – PhpDude

Verwandte Themen