PHP findet Unterschied zwischen zwei Datetimes

Lesezeit: 7 Minuten

PHP findet Unterschied zwischen zwei Datetimes
Staleyr

Ich versuche, den Unterschied zwischen zwei Datetimes zu ermitteln und ihn als zurückzugeben datetime. Ich habe Beispiele mit gefunden diff aber ich kann es nicht richtig hinbekommen.

$timein = date("Y-m-d H:i:s");
$timeout = date("Y-m-d 20:00:00");
$totaltime = $timein->diff($timeout);

aber $totaltime Protokolle 0000-00-00 00:00:00 zu meiner DB. Liegt das daran, dass ich meine Totaltime-Variable nicht formatiere?

  • date() gibt Ihnen Strings. Sie können keine Differenzen mit Zeichenfolgen berechnen.

    – Misch

    28. März 2013 um 17:55 Uhr

PHP findet Unterschied zwischen zwei Datetimes
John Conde

Ich bin mir nicht sicher, nach welchem ​​​​Format Sie in Ihrem Unterschied suchen, aber hier erfahren Sie, wie Sie dies mit DateTime tun

$datetime1 = new DateTime();
$datetime2 = new DateTime('2011-01-03 17:13:00');
$interval = $datetime1->diff($datetime2);
$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %s seconds');
echo $elapsed;

  • wirft den Fehler “Fatal error: Call to undefined method DateTime::diff()”

    – Staleyr

    28. März 2013 um 17:58 Uhr

  • Welche PHP-Version verwendest du?

    – John Conde

    28. März 2013 um 18:02 Uhr

  • Das sollte für Sie als 5.4-Unterstützung funktionieren diff() codepad.viper-7.com/FqGsrO

    – John Conde

    28. März 2013 um 18:05 Uhr


  • Ich stelle fest, dass mein Problem darin besteht, die Datetime in die Datenbank zu schreiben. Wenn es sich um ein Datum handelt, schreibt es in die Datenbank, aber Datetime nicht. Es muss in diesem Format YYYY-MM-DD HH:MM:SS oder Ymd H:i:s sein.

    – Staleyr

    28. März 2013 um 18:44 Uhr

  • Diese Antwort liefert das Ergebnis nicht im richtigen Format.

    – mickmackusa

    27. April 2017 um 2:02 Uhr

1646643247 363 PHP findet Unterschied zwischen zwei Datetimes
Nishu Tayal

Sie können einfach datetime diff und format zum Berechnen der Differenz verwenden.

<?php
$datetime1 = new DateTime('2009-10-11 12:12:00');
$datetime2 = new DateTime('2009-10-13 10:12:00');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%Y-%m-%d %H:%i:%s');
?>

Weitere Informationen zum Format DATETIME finden Sie unter: Hier

Sie können das Intervallformat beliebig ändern.

Hier ist das Arbeitsbeispiel

PS Diese Funktionen ( diff() und Format()) funktionieren nur mit >=PHP 5.3.0

  • Abstimmen. Dadurch wird das Ergebnis nicht in dem vom OP angeforderten Format bereitgestellt.

    – mickmackusa

    27. April 2017 um 2:00 Uhr

John Conde führt in seiner Methode alle richtigen Verfahren durch, erfüllt jedoch nicht den letzten Schritt in Ihrer Frage, nämlich das Formatieren des Ergebnisses gemäß Ihren Spezifikationen.

Dieser Code (Demo) zeigt den Rohunterschied an, deckt die Probleme auf, wenn versucht wird, den Rohunterschied sofort zu formatieren, zeigt meine Vorbereitungsschritte an und präsentiert schließlich das korrekt formatierte Ergebnis:

$datetime1 = new DateTime('2017-04-26 18:13:06');
$datetime2 = new DateTime('2011-01-17 17:13:00');  // change the millenium to see output difference
$diff = $datetime1->diff($datetime2);

// this will get you very close, but it will not pad the digits to conform with your expected format
echo "Raw Difference: ",$diff->format('%y years %m months %d days %h hours %i minutes %s seconds'),"\n";

// Notice the impact when you change $datetime2's millenium from '1' to '2'
echo "Invalid format: ",$diff->format('%Y-%m-%d %H:%i:%s'),"\n";  // only H does it right

$details=array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s']));

echo '$detail array: ';
var_export($details);
echo "\n";

array_map(function($v,$k)
    use(&$r)
    {
        $r.=($k=='y'?str_pad($v,4,"0",STR_PAD_LEFT):str_pad($v,2,"0",STR_PAD_LEFT));
        if($k=='y' || $k=='m'){$r.="-";}
        elseif($k=='d'){$r.=" ";}
        elseif($k=='h' || $k=='i'){$r.=":";}
    },$details,array_keys($details)
);
echo "Valid format: ",$r; // now all components of datetime are properly padded

Ausgabe:

Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds
Invalid format: 06-3-9 01:0:6
$detail array: array (
  'y' => 6,
  'm' => 3,
  'd' => 9,
  'h' => 1,
  'i' => 0,
  's' => 6,
)
Valid format: 0006-03-09 01:00:06

Nun, um meine Datetime-Wertvorbereitung zu erklären:

$details nimmt die diff-Objekt und wirft es als Array.
array_flip([‘y’,’m’,’d’,’h’,’i’,’s’]) erstellt ein Array von Schlüsseln, aus dem alle irrelevanten Schlüssel entfernt werden (array)$diff verwenden array_intersect_key().

Dann mit array_map() Meine Methode iteriert jeden Wert und gibt ihn ein $detailspolstert seine linke Seite auf die entsprechende Länge mit auf 0‘s und verkettet die $r (Ergebnis-)String mit den erforderlichen Trennzeichen, um dem angeforderten Datetime-Format zu entsprechen.

Der folgende Code zeigt den Unterschied nur für gefundene Werte, dh wenn Jahre = 0 sind, werden keine Jahre angezeigt.


$diffs = [
    'years' => 'y',
    'months' => 'm',
    'days' => 'd',
    'hours' => 'h',
    'minutes' => 'i',
    'seconds' => 's'
];

$interval = $timeout->diff($timein);
$diffArr = [];
foreach ($diffs as $k => $v) {
    $d = $interval->format('%' . $v);
    if ($d > 0) {
        $diffArr[] = $d . ' ' . $k;
    }
}    
$diffStr = implode(', ', $diffArr);
echo 'Difference: ' . ($diffStr == '' ? '0' : $diffStr) . PHP_EOL;

1646643247 153 PHP findet Unterschied zwischen zwei Datetimes
Benutzer3189081

Entschuldigung, meine vorherige Antwort war falsch. Wenn Sie versuchen, die zwischen Zeit und Zeitüberschreitung verstrichene Gesamtzeit in der Y-m-d H:i:s Format, nehmen Sie den Unterschied zwischen Zeitüberschreitung und Zeit in Verwendung DateTime Objekt und formatieren Sie es als '%y-%m-%d %H:%i:%s'.

  • Bitte erläutern Sie Ihre Antwort und posten Sie nicht nur den Code.

    – Herr Maavin

    14. Mai 2019 um 13:38 Uhr

1646643247 717 PHP findet Unterschied zwischen zwei Datetimes
Lesenus

Ich habe viele Themen gesammelt, um eine universelle Funktion mit vielen Ausgaben (Jahre, Monate, Tage, Stunden, Minuten, Sekunden) mit Zeichenfolge oder Analyse in int und Richtung + zu erstellen, wenn Sie wissen müssen, welche Seite die Richtung des Unterschieds ist.

Anwendungsbeispiel:



    $date1='2016-05-27 02:00:00';
    $format="Y-m-d H:i:s";

    echo timeDifference($date1, $format, '2017-08-30 00:01:59', $format); 
    #1 years 3 months 2 days 22 hours 1 minutes 59 seconds (string)

    echo timeDifference($date1, $format, '2017-08-30 00:01:59', $format,false, '%a days %h hours');
    #459 days 22 hours (string)

    echo timeDifference('2016-05-27 00:00:00', $format, '2017-08-30 00:01:59', $format,true, '%d days -> %H:%I:%S', true);
    #-3 days -> 00:01:59 (string)

    echo timeDifference($date1, $format, '2016-05-27 00:05:51', $format, false, 'seconds');
    #9 (string)

    echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, false, 'hours');
    #5 (string)

    echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, true, 'hours');
    #-5 (string)

    echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, true, 'hours',true);
    #-5 (int)

Funktion



    function timeDifference($date1_pm_checked, $date1_format,$date2, $date2_format, $plus_minus=false, $return='all', $parseInt=false)
    {
        $strtotime1=strtotime($date1_pm_checked);
        $strtotime2=strtotime($date2);
        $date1 = new DateTime(date($date1_format, $strtotime1));
        $date2 = new DateTime(date($date2_format, $strtotime2));
        $interval=$date1->diff($date2);

        $plus_minus=(empty($plus_minus)) ? '' : ( ($strtotime1 > $strtotime2) ? '+' : '-'); # +/-/no_sign before value 

        switch($return)
        {
            case 'y';
            case 'year';
            case 'years';
                $elapsed = $interval->format($plus_minus.'%y');
                break;

            case 'm';
            case 'month';
            case 'months';
                $elapsed = $interval->format($plus_minus.'%m');
                break;

            case 'a';
            case 'day';
            case 'days';
                $elapsed = $interval->format($plus_minus.'%a');
                break;

            case 'd';
                $elapsed = $interval->format($plus_minus.'%d');
                break;

            case 'h';       
            case 'hour';        
            case 'hours';       
                $elapsed = $interval->format($plus_minus.'%h');
                break;

            case 'i';
            case 'minute';
            case 'minutes';
                $elapsed = $interval->format($plus_minus.'%i');
                break;

            case 's';
            case 'second';
            case 'seconds';
                $elapsed = $interval->format($plus_minus.'%s');
                break;

            case 'all':
                $parseInt=false;
                $elapsed = $plus_minus.$interval->format('%y years %m months %d days %h hours %i minutes %s seconds');
                break;

            default:
                $parseInt=false;
                $elapsed = $plus_minus.$interval->format($return);
        }

        if($parseInt)
            return (int) $elapsed;
        else
            return $elapsed;

    }

  • Bitte erläutern Sie Ihre Antwort und posten Sie nicht nur den Code.

    – Herr Maavin

    14. Mai 2019 um 13:38 Uhr

1646643247 717 PHP findet Unterschied zwischen zwei Datetimes
Lesenus

Hier ist mein vollständiger Beitrag mit dem Thema: PHP findet den Unterschied zwischen zwei Datetimes

ANWENDUNGSBEISPIEL


    echo timeDifference('2016-05-27 02:00:00', 'Y-m-d H:i:s', '2017-08-30 00:01:59', 'Y-m-d H:i:s', false, '%a days %h hours');
    #459 days 22 hours (string)

    echo timeDifference('2016-05-27 02:00:00', 'Y-m-d H:i:s', '2016-05-27 07:00:00', 'Y-m-d H:i:s', true, 'hours',true);
    #-5 (int)

964560cookie-checkPHP findet Unterschied zwischen zwei Datetimes

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy