Verwenden Sie dies für Legacy-Code (PHP <5.3). Für eine aktuelle Lösung siehe Jurkas Antwort unten
Mit strtotime () können Sie zwei Daten in Unix-Zeit konvertieren und dann die Anzahl der Sekunden zwischen ihnen berechnen. Daraus ist es ziemlich einfach, verschiedene Zeiträume zu berechnen.
Bearbeiten: Offensichtlich ist die bevorzugte Methode dies wie von Jurka unten beschrieben. Mein Code wird im Allgemeinen nur empfohlen, wenn Sie nicht über PHP 5.3 oder besser verfügen.
Mehrere Personen in den Kommentaren haben darauf hingewiesen, dass der obige Code nur eine Annäherung ist. Ich glaube immer noch, dass dies für die meisten Zwecke in Ordnung ist, da die Verwendung eines Bereichs eher dazu dient, ein Gefühl dafür zu vermitteln, wie viel Zeit vergangen ist oder verbleibt, als um Präzision zu gewährleisten. Wenn Sie dies tun möchten, geben Sie einfach das Datum aus.
Trotz alledem habe ich mich entschlossen, die Beschwerden anzusprechen. Wenn Sie wirklich einen genauen Bereich benötigen, aber keinen Zugriff auf PHP 5.3 haben, verwenden Sie den folgenden Code (er sollte auch in PHP 4 funktionieren). Dies ist ein direkter Port des Codes, den PHP intern zur Berechnung von Bereichen verwendet, mit der Ausnahme, dass die Sommerzeit nicht berücksichtigt wird. Das bedeutet, dass es höchstens eine Stunde dauert, aber ansonsten sollte es korrekt sein.
Wenn Sie die DateTime-Klasse verwenden, können Sie das Format $ date-> ('U') wählen, um den Unix-Zeitstempel abzurufen.
Jon Cram
4
Es ist nicht wahr, wenn Sie sich mit Sommer / Winter beschäftigen müssen. In diesem speziellen Fall entspricht ein Tag 23 oder 25 Stunden, wenn Sie die Sommer- / Winterzeit anpassen.
Arno
4
Nun, das gleiche Argument könnte für Schaltjahre gemacht werden. Das wird auch nicht berücksichtigt. Trotzdem bin ich nicht davon überzeugt, dass Sie dies überhaupt berücksichtigen möchten, da wir hier einen Bereich diskutieren. Die Semantik für einen Bereich ist etwas anders als für ein absolutes Datum.
Emil H
9
Diese Funktion ist falsch. Es ist gut für eine Annäherung, aber falsch für genaue Bereiche. Zum einen wird davon ausgegangen, dass ein Monat 30 Tage hat, was bedeutet, dass zwischen dem 1. Februar und dem 1. März die gleiche Tagesdifferenz besteht wie zwischen dem 1. Juli und dem 1. August (unabhängig vom Schaltjahr).
Enobrev
1
In PHP befinden sich Referenzvariablen in der Funktionssignatur, nicht im Aufruf. Bewegen Sie alle Ihre &zu den Unterschriften.
Paul Tarjan
909
Ich schlage vor, DateTime- und DateInterval-Objekte zu verwenden.
$date1 =newDateTime("2007-03-24");
$date2 =newDateTime("2009-06-26");
$interval = $date1->diff($date2);
echo "difference ". $interval->y ." years, ". $interval->m." months, ".$interval->d." days ";// shows the total amount of days (not divided into years, months and days like above)
echo "difference ". $interval->days ." days ";
+1 DateTime behandelt Schaltjahre und Zeitzonen richtig und es gibt ein gutes Buch für das Regal: phparch.com/books/…
hakre
3
Gibt es eine Methode, die die Gesamtzahl der Sekunden zwischen den beiden DateTimes angibt? (ohne die Komponenten zu addieren, das heißt)
Kartoffel
1
@Panique Die $ Intervall-> Tage und $ Intervall-> d sind verschiedene Maße. Ihr Kommentar oben ist richtig "zeigt die Gesamtzahl der Tage (nicht in Jahre, Monate und Tage wie oben unterteilt)"
Jurka
1
@potatoe Du willst wahrscheinlich $date2->format('U') - $date1->format('U').
Die beste Vorgehensweise ist die Verwendung der DateTime(und DateInterval) Objekte von PHP . Jedes Datum ist in einem DateTimeObjekt gekapselt , und dann kann ein Unterschied zwischen den beiden gemacht werden:
Das DateTimeObjekt akzeptiert jedes Format strtotime(). Wenn ein noch spezifischeres Datumsformat benötigt wird, DateTime::createFromFormat()kann es zum Erstellen des DateTimeObjekts verwendet werden.
Nachdem beide Objekte instanziiert wurden, subtrahieren Sie mit DateTime::diff().
$difference = $first_date->diff($second_date);
$differencehält jetzt ein DateIntervalObjekt mit den Differenzinformationen. A var_dump()sieht so aus:
Wir haben ein Problem, tauschen Sie first_date gegen second_date aus und wir erhalten das gleiche Ergebnis? Warum nicht 0 Tage 0 Stunden 0 Minuten 0 Sekunden oder nur 0 sagen? Beispiel: 2012-11-30 17:03:30 - 2012-12-21 00:00:00 und 2012-12-21 00:00:00 - 2012-11-30 17:03:30 erhalten das gleiche Ergebnis.
EgoistDeveloper
Weil diff Ihnen den Unterschied zwischen den beiden Zeiten gibt. Die Differenz ist nicht 0, unabhängig davon, welches Datum später kommt.
Madaras Geist
1
Dies ist eine wirklich gute Antwort, da sie eine klare Funktion bietet, die von überall in einer Codebasis ohne viel Zeitaufwand aufgerufen werden kann. Andere Antworten ermöglichen es Ihnen, Echo-Berechnungen im laufenden Betrieb zu löschen, die die Symptome beheben, anstatt das Problem zu lösen ... Das einzige Element, das ich hinzugefügt habe (und so ziemlich alle anderen Beiträge behandeln dies nicht), ist die Pluralisierung von $ -Intervall-Elementen wenn mehr als 1.
Wahrscheinlich liefert dies nicht das genaue Ergebnis.
Delphin
8
Und ist eine schreckliche Lösung, es sei denn, Sie sind gezwungen, eine schrecklich veraltete Version von PHP zu verwenden ...
Rdlowrey
2
Nicht so trocken . Zum Beispiel wird 60 * 60 * 24 15 Mal wiederholt. Es lebe die Wiederverwendung durch Kopieren und Einfügen!
Peter Mortensen
Was ist mit Schaltjahren? Ein Jahr ist im Durchschnitt nicht 365 Tage.
Peter Mortensen
Dieser Code geht davon aus, dass ein Monat durchschnittlich 30 Tage beträgt. Selbst wenn 365 Tage für ein Jahr angenommen werden, beträgt ein durchschnittlicher Monat 365/12 = 30,42 Tage (ungefähr).
Peter Mortensen
18
Schauen Sie sich den folgenden Link an. Dies ist die beste Antwort, die ich bisher gefunden habe .. :)
function dateDiff ($d1, $d2){// Return the number of days between the two dates: return round(abs(strtotime($d1)- strtotime($d2))/86400);}// end function dateDiff
Es spielt keine Rolle, welches Datum früher oder später liegt, wenn Sie die Datumsparameter übergeben. Die Funktion verwendet den PHP ABS () - Absolutwert, um immer eine positive Zahl als Anzahl der Tage zwischen den beiden Daten zurückzugeben.
Beachten Sie, dass die Anzahl der Tage zwischen den beiden Daten NICHT beide Daten enthält. Wenn Sie also nach der Anzahl der Tage suchen, die durch alle Daten zwischen und einschließlich der eingegebenen Daten dargestellt werden, müssen Sie dem Ergebnis dieser Funktion eine (1) hinzufügen.
Beispielsweise beträgt die Differenz (wie von der obigen Funktion zurückgegeben) zwischen 2013-02-09 und 2013-02-14 5. Die Anzahl der Tage oder Daten wird jedoch durch den Datumsbereich 2013-02-09 - 2013-02- dargestellt. 14 ist 6.
Bei der Frage wurde nach dem Unterschied als Anzahl der Jahre, Monate und Tage gefragt, nicht nach der Gesamtzahl der Tage.
Peter Mortensen
14
Ich habe für jurka ‚s Antwort wie mein Favorit ist, aber ich habe eine Pre-php.5.3 Version ...
Ich habe an einem ähnlichen Problem gearbeitet - so kam ich überhaupt zu dieser Frage -, brauchte aber nur einen Unterschied in Stunden. Aber meine Funktion hat dieses Problem auch ziemlich gut gelöst und ich habe nirgendwo in meiner eigenen Bibliothek, wo ich es aufbewahren kann, wo es nicht verloren geht und vergessen wird. Ich hoffe, dass dies für jemanden nützlich ist.
Ich habe die ursprüngliche Idee von hier , die ich für meine Anwendungen modifizierte (und ich hoffe , meine Änderung auf dieser Seite zeigt auch).
Sie können Intervalle, die Sie nicht möchten (z. B. "Woche"), sehr einfach entfernen, indem Sie sie aus dem $aIntervalsArray entfernen oder einen $aExcludeParameter hinzufügen oder sie einfach herausfiltern, wenn Sie die Zeichenfolge ausgeben.
Leider gibt dies aufgrund von Jahres- / Monatsüberläufen nicht dasselbe wie DateInterval zurück.
Stephen Harris
2
@StephenHarris: Ich habe dies nicht getestet, aber beim Lesen des Codes bin ich ziemlich sicher, dass es das gleiche Ergebnis zurückgeben sollte - vorausgesetzt, Sie löschen den weekIndex in $aIntervals(da dies DateDiffnie verwendet wird).
Alix Axel
Dies ist eine großartige Lösung, um Daten zu finden, die in jedem Intervall zwischen zwei Daten auftreten.
Zwischen Gehirn
14
<?php
$today = strtotime("2011-02-03 00:00:00");
$myBirthDate = strtotime("1964-10-30 00:00:00");
printf("Days since my birthday: ",($today - $myBirthDate)/60/60/24);?>
Die Frage stellte den Unterschied als Anzahl der Jahre , Monate und Tage . Dies gibt die Differenz als Gesamtzahl der Tage aus.
Peter Mortensen
11
Ich weiß nicht, ob Sie ein PHP-Framework verwenden oder nicht, aber viele PHP-Frameworks verfügen über Datums- / Zeitbibliotheken und Helfer, die Sie davon abhalten, das Rad neu zu erfinden.
Zum Beispiel hat CodeIgniter die timespan()Funktion. Geben Sie einfach zwei Unix-Zeitstempel ein und es wird automatisch ein Ergebnis wie das folgende generiert:
scheint nicht zu funktionieren. Ich bekomme ein Date zu Beginn der Zeitstempel-Ära.
Sirber
Es ist wichtig zu verstehen, dass Sie eine durchführen müssen $my_t["year"] -= 1970, um die richtige Anzahl von Jahren zu erhalten. Sie müssen auch Ihre Stundendifferenz von GMT abziehen , um die richtigen Stunden zu erhalten. Sie müssen auch 1 von Monat und Datum abziehen.
Salman A
6
// If you just want to see the year difference then use this function.// Using the logic I've created you may also create month and day difference// which I did not provide here so you may have the efforts to use your brain.// :)
$date1='2009-01-01';
$date2='2010-01-01';
echo getYearDifference ($date1,$date2);function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){
$year =0;while($date2 > $date1 = strtotime('+1 year', $date1)){++$year;}return $year;}
Das ist meine Funktion. Erforderliches PHP> = 5.3.4. Es wird die DateTime-Klasse verwendet. Sehr schnell, schnell und kann den Unterschied zwischen zwei Daten oder sogar der sogenannten "Zeit seit" machen.
if(function_exists('grk_Datetime_Since')=== FALSE){function grk_Datetime_Since($From, $To='', $Prefix='', $Suffix=' ago', $Words=array()){# Est-ce qu'on calcul jusqu'à un moment précis ? Probablement pas, on utilise maintenantif(empty($To)=== TRUE){
$To = time();}# On va s'assurer que $From est numériqueif(is_int($From)=== FALSE){
$From = strtotime($From);};# On va s'assurer que $To est numériqueif(is_int($To)=== FALSE){
$To = strtotime($To);}# On a une erreur ?if($From === FALSE OR $From ===-1 OR $To === FALSE OR $To ===-1){return FALSE;}# On va créer deux objets de date
$From =newDateTime(@date('Y-m-d H:i:s', $From),newDateTimeZone('GMT'));
$To =newDateTime(@date('Y-m-d H:i:s', $To),newDateTimeZone('GMT'));# On va calculer la différence entre $From et $Toif(($Diff = $From->diff($To))=== FALSE){return FALSE;}# On va merger le tableau des noms (par défaut, anglais)
$Words = array_merge(array('year'=>'year','years'=>'years','month'=>'month','months'=>'months','week'=>'week','weeks'=>'weeks','day'=>'day','days'=>'days','hour'=>'hour','hours'=>'hours','minute'=>'minute','minutes'=>'minutes','second'=>'second','seconds'=>'seconds'), $Words);# On va créer la chaîne maintenantif($Diff->y >1){
$Text = $Diff->y.' '.$Words['years'];} elseif($Diff->y ==1){
$Text ='1 '.$Words['year'];} elseif($Diff->m >1){
$Text = $Diff->m.' '.$Words['months'];} elseif($Diff->m ==1){
$Text ='1 '.$Words['month'];} elseif($Diff->d >7){
$Text = ceil($Diff->d/7).' '.$Words['weeks'];} elseif($Diff->d ==7){
$Text ='1 '.$Words['week'];} elseif($Diff->d >1){
$Text = $Diff->d.' '.$Words['days'];} elseif($Diff->d ==1){
$Text ='1 '.$Words['day'];} elseif($Diff->h >1){
$Text = $Diff->h.' '.$Words['hours'];} elseif($Diff->h ==1){
$Text ='1 '.$Words['hour'];} elseif($Diff->i >1){
$Text = $Diff->i.' '.$Words['minutes'];} elseif($Diff->i ==1){
$Text ='1 '.$Words['minute'];} elseif($Diff->s >1){
$Text = $Diff->s.' '.$Words['seconds'];}else{
$Text ='1 '.$Words['second'];}return $Prefix.$Text.$Suffix;}}
Dadurch wird versucht festzustellen, ob ein Zeitstempel angegeben wurde oder nicht, und es werden auch zukünftige Daten / Zeiten als negative Werte zurückgegeben:
<?php
function time_diff($start, $end = NULL, $convert_to_timestamp = FALSE){// If $convert_to_timestamp is not explicitly set to TRUE,// check to see if it was accidental:if($convert_to_timestamp ||!is_numeric($start)){// If $convert_to_timestamp is TRUE, convert to timestamp:
$timestamp_start = strtotime($start);}else{// Otherwise, leave it as a timestamp:
$timestamp_start = $start;}// Same as above, but make sure $end has actually been overridden with a non-null,// non-empty, non-numeric value:if(!is_null($end)&&(!empty($end)&&!is_numeric($end))){
$timestamp_end = strtotime($end);}else{// If $end is NULL or empty and non-numeric value, assume the end time desired// is the current time (useful for age, etc):
$timestamp_end = time();}// Regardless, set the start and end times to an integer:
$start_time =(int) $timestamp_start;
$end_time =(int) $timestamp_end;// Assign these values as the params for $then and $now:
$start_time_var ='start_time';
$end_time_var ='end_time';// Use this to determine if the output is positive (time passed) or negative (future):
$pos_neg =1;// If the end time is at a later time than the start time, do the opposite:if($end_time <= $start_time){
$start_time_var ='end_time';
$end_time_var ='start_time';
$pos_neg =-1;}// Convert everything to the proper format, and do some math:
$then =newDateTime(date('Y-m-d H:i:s', $$start_time_var));
$now =newDateTime(date('Y-m-d H:i:s', $$end_time_var));
$years_then = $then->format('Y');
$years_now = $now->format('Y');
$years = $years_now - $years_then;
$months_then = $then->format('m');
$months_now = $now->format('m');
$months = $months_now - $months_then;
$days_then = $then->format('d');
$days_now = $now->format('d');
$days = $days_now - $days_then;
$hours_then = $then->format('H');
$hours_now = $now->format('H');
$hours = $hours_now - $hours_then;
$minutes_then = $then->format('i');
$minutes_now = $now->format('i');
$minutes = $minutes_now - $minutes_then;
$seconds_then = $then->format('s');
$seconds_now = $now->format('s');
$seconds = $seconds_now - $seconds_then;if($seconds <0){
$minutes -=1;
$seconds +=60;}if($minutes <0){
$hours -=1;
$minutes +=60;}if($hours <0){
$days -=1;
$hours +=24;}
$months_last = $months_now -1;if($months_now ==1){
$years_now -=1;
$months_last =12;}// "Thirty days hath September, April, June, and November" ;)if($months_last ==9|| $months_last ==4|| $months_last ==6|| $months_last ==11){
$days_last_month =30;}elseif($months_last ==2){// Factor in leap years:if(($years_now %4)==0){
$days_last_month =29;}else{
$days_last_month =28;}}else{
$days_last_month =31;}if($days <0){
$months -=1;
$days += $days_last_month;}if($months <0){
$years -=1;
$months +=12;}// Finally, multiply each value by either 1 (in which case it will stay the same),// or by -1 (in which case it will become negative, for future dates).// Note: 0 * 1 == 0 * -1 == 0
$out =new stdClass;
$out->years =(int) $years * $pos_neg;
$out->months =(int) $months * $pos_neg;
$out->days =(int) $days * $pos_neg;
$out->hours =(int) $hours * $pos_neg;
$out->minutes =(int) $minutes * $pos_neg;
$out->seconds =(int) $seconds * $pos_neg;return $out;}
Ich habe Ihren Artikel auf der folgenden Seite gefunden, die eine Reihe von Referenzen für PHP- Datums- und Uhrzeitberechnungen enthält.
Berechnen Sie die Differenz zwischen zwei Daten (und der Zeit) mit PHP. Auf der folgenden Seite finden Sie eine Reihe verschiedener Methoden (insgesamt 7) zur Durchführung von Datums- / Zeitberechnungen mit PHP, um den Unterschied in Zeit (Stunden, Munition), Tagen, Monaten oder Jahren zwischen zwei Daten zu bestimmen.
Sie können auch den folgenden Code verwenden, um Datumsunterschiede nach runden Brüchen zurückzugeben. $ Date1 = $ duedate; // Fälligkeitsdatum zuweisen echo $ date2 = date ("Ymd"); // aktuelles Datum $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ Sekunden_diff = $ ts1 - $ ts2; echo $ datiertiff = Ceil (($ Sekunden_Diff / 3600) / 24); // in Tagen zurückkehren
Wenn Sie die Bodenmethode von PHP anstelle von Ceil verwenden, erhalten Sie den runden Bruch nach unten. Überprüfen Sie den Unterschied hier. Wenn sich die Zeitzone Ihres Staging-Servers von der Zeitzone der Live-Site unterscheidet, erhalten Sie möglicherweise andere Ergebnisse. Ändern Sie daher die Bedingungen entsprechend.
Für PHP-Version> = 5.3: Erstellen Sie zwei Datumsobjekte und verwenden Sie dann die date_diff()Funktion. Es wird ein PHP DateInterval- Objekt zurückgeben. siehe Dokumentation
Ich hatte das gleiche Problem mit PHP 5.2 und löste es mit MySQL. Könnte nicht genau das sein, wonach Sie suchen, aber dies reicht aus und gibt die Anzahl der Tage zurück:
Da jeder Codebeispiele veröffentlicht, ist hier eine andere Version.
Ich wollte eine Funktion, die Unterschiede von Sekunden bis Jahren anzeigt (nur eine Einheit). Für Zeiträume über 1 Tag wollte ich, dass es um Mitternacht überrollt wird (Montag um 10 Uhr ab 9 Uhr Mittwoch ist vor 2 Tagen, nicht 1). Und für Zeiträume über einen Monat wollte ich, dass der Rollover am selben Tag des Monats stattfindet (einschließlich für 30/31 Tage, Monate und Schaltjahre).
Das habe ich mir ausgedacht:
/**
* Returns how long ago something happened in the past, showing it
* as n seconds / minutes / hours / days / weeks / months / years ago.
*
* For periods over a day, it rolls over at midnight (so doesn't depend
* on current time of day), and it correctly accounts for month-lengths
* and leap-years (months and years rollover on current day of month).
*
* $param string $timestamp in DateTime format
* $return string description of interval
*/function ago($timestamp){
$then = date_create($timestamp);// for anything over 1 day, make it rollover on midnight
$today = date_create('tomorrow');// ie end of today
$diff = date_diff($then, $today);if($diff->y >0)return $diff->y.' year'.($diff->y>1?'s':'').' ago';if($diff->m >0)return $diff->m.' month'.($diff->m>1?'s':'').' ago';
$diffW = floor($diff->d /7);if($diffW >0)return $diffW.' week'.($diffW>1?'s':'').' ago';if($diff->d >1)return $diff->d.' day'.($diff->d>1?'s':'').' ago';// for anything less than 1 day, base it off 'now'
$now = date_create();
$diff = date_diff($then, $now);if($diff->d >0)return'yesterday';if($diff->h >0)return $diff->h.' hour'.($diff->h>1?'s':'').' ago';if($diff->i >0)return $diff->i.' minute'.($diff->i>1?'s':'').' ago';return $diff->s.' second'.($diff->s==1?'':'s').' ago';}
Diese Antwort ist genauso falsch wie Khaldonnos Antwort. Es wird angenommen (Fall 10), dass ein Jahr 365 Tage hat (jedes vierte Jahr hat 366 Tage (mit Ausnahme der Regeln für 100 Jahre / 400 Jahre für den Gregorianischen Kalender)) und dass ein Monat 30 Tage hat (es sind ungefähr 30,42 Tage in Nicht-Schaltjahren). Selbst mit besseren Konstanten ist es nur im Durchschnitt korrekt, nicht unbedingt für zwei bestimmte Daten.
Peter Mortensen
3
Sehr einfach:
<?php
$date1 = date_create("2007-03-24");
echo "Start date: ".$date1->format("Y-m-d")."<br>";
$date2 = date_create("2009-06-26");
echo "End date: ".$date2->format("Y-m-d")."<br>";
$diff = date_diff($date1,$date2);
echo "Difference between start date and end date: ".$diff->format("%y years, %m months and %d days")."<br>";?>
Bitte überprüfen Sie den folgenden Link für Details:
Es werden zwei Schleifen ausgeführt. Das erste behandelt die relativen Intervalle (Jahre und Monate) durch Brute-Forcing, und das zweite berechnet die zusätzlichen absoluten Intervalle mit einfacher Arithmetik (also schneller):
Antworten:
Mit strtotime () können Sie zwei Daten in Unix-Zeit konvertieren und dann die Anzahl der Sekunden zwischen ihnen berechnen. Daraus ist es ziemlich einfach, verschiedene Zeiträume zu berechnen.
Bearbeiten: Offensichtlich ist die bevorzugte Methode dies wie von Jurka unten beschrieben. Mein Code wird im Allgemeinen nur empfohlen, wenn Sie nicht über PHP 5.3 oder besser verfügen.
Mehrere Personen in den Kommentaren haben darauf hingewiesen, dass der obige Code nur eine Annäherung ist. Ich glaube immer noch, dass dies für die meisten Zwecke in Ordnung ist, da die Verwendung eines Bereichs eher dazu dient, ein Gefühl dafür zu vermitteln, wie viel Zeit vergangen ist oder verbleibt, als um Präzision zu gewährleisten. Wenn Sie dies tun möchten, geben Sie einfach das Datum aus.
Trotz alledem habe ich mich entschlossen, die Beschwerden anzusprechen. Wenn Sie wirklich einen genauen Bereich benötigen, aber keinen Zugriff auf PHP 5.3 haben, verwenden Sie den folgenden Code (er sollte auch in PHP 4 funktionieren). Dies ist ein direkter Port des Codes, den PHP intern zur Berechnung von Bereichen verwendet, mit der Ausnahme, dass die Sommerzeit nicht berücksichtigt wird. Das bedeutet, dass es höchstens eine Stunde dauert, aber ansonsten sollte es korrekt sein.
quelle
&
zu den Unterschriften.Ich schlage vor, DateTime- und DateInterval-Objekte zu verwenden.
Lesen Sie mehr PHP DateTime :: Diff Handbuch
Aus dem Handbuch:
quelle
$date2->format('U') - $date1->format('U')
.Die beste Vorgehensweise ist die Verwendung der
DateTime
(undDateInterval
) Objekte von PHP . Jedes Datum ist in einemDateTime
Objekt gekapselt , und dann kann ein Unterschied zwischen den beiden gemacht werden:Das
DateTime
Objekt akzeptiert jedes Formatstrtotime()
. Wenn ein noch spezifischeres Datumsformat benötigt wird,DateTime::createFromFormat()
kann es zum Erstellen desDateTime
Objekts verwendet werden.Nachdem beide Objekte instanziiert wurden, subtrahieren Sie mit
DateTime::diff()
.$difference
hält jetzt einDateInterval
Objekt mit den Differenzinformationen. Avar_dump()
sieht so aus:Um das
DateInterval
Objekt zu formatieren , müssen wir jeden Wert überprüfen und ausschließen, wenn er 0 ist:Jetzt müssen wir nur noch unsere Funktion für das
$difference
DateInterval
Objekt aufrufen :Und wir bekommen das richtige Ergebnis:
Der vollständige Code zur Erreichung des Ziels:
quelle
DateTime()
ist keine Funktion, es ist ein Objekt und es ist da seit PHP 5.2. Stellen Sie sicher, dass Ihr Server dies unterstützt.Stunden und Minuten und Sekunden anzeigen ..
quelle
Schauen Sie sich den folgenden Link an. Dies ist die beste Antwort, die ich bisher gefunden habe .. :)
http://www.bizinfosys.com/php/date-difference.html
quelle
Ich habe für jurka ‚s Antwort wie mein Favorit ist, aber ich habe eine Pre-php.5.3 Version ...
Ich habe an einem ähnlichen Problem gearbeitet - so kam ich überhaupt zu dieser Frage -, brauchte aber nur einen Unterschied in Stunden. Aber meine Funktion hat dieses Problem auch ziemlich gut gelöst und ich habe nirgendwo in meiner eigenen Bibliothek, wo ich es aufbewahren kann, wo es nicht verloren geht und vergessen wird. Ich hoffe, dass dies für jemanden nützlich ist.
Und der Test:
Und das Ergebnis:
Ich habe die ursprüngliche Idee von hier , die ich für meine Anwendungen modifizierte (und ich hoffe , meine Änderung auf dieser Seite zeigt auch).
Sie können Intervalle, die Sie nicht möchten (z. B. "Woche"), sehr einfach entfernen, indem Sie sie aus dem
$aIntervals
Array entfernen oder einen$aExclude
Parameter hinzufügen oder sie einfach herausfiltern, wenn Sie die Zeichenfolge ausgeben.quelle
week
Index in$aIntervals
(da diesDateDiff
nie verwendet wird).quelle
Ich weiß nicht, ob Sie ein PHP-Framework verwenden oder nicht, aber viele PHP-Frameworks verfügen über Datums- / Zeitbibliotheken und Helfer, die Sie davon abhalten, das Rad neu zu erfinden.
Zum Beispiel hat CodeIgniter die
timespan()
Funktion. Geben Sie einfach zwei Unix-Zeitstempel ein und es wird automatisch ein Ergebnis wie das folgende generiert:http://codeigniter.com/user_guide/helpers/date_helper.html
quelle
Anwendungsbeispiel:
Ausgabe :
Funktion:
quelle
Ich habe eine einfache Logik dafür:
quelle
Du kannst den ... benutzen
Funktion, die ein Array zurückgibt, das alle Elemente des angegebenen Datums / der angegebenen Uhrzeit enthält:
Wenn Ihre Start- und Enddaten im Zeichenfolgenformat vorliegen, verwenden Sie
vor dem obigen Code
quelle
$my_t["year"] -= 1970
, um die richtige Anzahl von Jahren zu erhalten. Sie müssen auch Ihre Stundendifferenz von GMT abziehen , um die richtigen Stunden zu erhalten. Sie müssen auch 1 von Monat und Datum abziehen.quelle
Das ist meine Funktion. Erforderliches PHP> = 5.3.4. Es wird die DateTime-Klasse verwendet. Sehr schnell, schnell und kann den Unterschied zwischen zwei Daten oder sogar der sogenannten "Zeit seit" machen.
quelle
Ich würde es vorziehen , Verwendung
date_create
unddate_diff
Objekte.Code:
Ausgabe:
Weitere Informationen finden Sie im PHP-
date_diff
Handbuchquelle
Dadurch wird versucht festzustellen, ob ein Zeitstempel angegeben wurde oder nicht, und es werden auch zukünftige Daten / Zeiten als negative Werte zurückgegeben:
Anwendungsbeispiel:
Oder:
quelle
"Wenn" das Datum in MySQL gespeichert ist, fällt es mir leichter, die Differenzberechnung auf Datenbankebene durchzuführen.
quelle
Ich habe Ihren Artikel auf der folgenden Seite gefunden, die eine Reihe von Referenzen für PHP- Datums- und Uhrzeitberechnungen enthält.
Berechnen Sie die Differenz zwischen zwei Daten (und der Zeit) mit PHP. Auf der folgenden Seite finden Sie eine Reihe verschiedener Methoden (insgesamt 7) zur Durchführung von Datums- / Zeitberechnungen mit PHP, um den Unterschied in Zeit (Stunden, Munition), Tagen, Monaten oder Jahren zwischen zwei Daten zu bestimmen.
Siehe PHP Date Time - 7 Methoden zur Berechnung der Differenz zwischen zwei Daten .
quelle
Sie können auch den folgenden Code verwenden, um Datumsunterschiede nach runden Brüchen zurückzugeben. $ Date1 = $ duedate; // Fälligkeitsdatum zuweisen echo $ date2 = date ("Ymd"); // aktuelles Datum $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ Sekunden_diff = $ ts1 - $ ts2; echo $ datiertiff = Ceil (($ Sekunden_Diff / 3600) / 24); // in Tagen zurückkehren
Wenn Sie die Bodenmethode von PHP anstelle von Ceil verwenden, erhalten Sie den runden Bruch nach unten. Überprüfen Sie den Unterschied hier. Wenn sich die Zeitzone Ihres Staging-Servers von der Zeitzone der Live-Site unterscheidet, erhalten Sie möglicherweise andere Ergebnisse. Ändern Sie daher die Bedingungen entsprechend.
quelle
quelle
Sie können immer die folgende Funktion verwenden, die das Alter in Jahren und Monaten (dh 1 Jahr 4 Monate) zurückgeben kann.
oder wenn Sie möchten, dass das Alter zum aktuellen Datum berechnet wird, können Sie verwenden
quelle
Für PHP-Version> = 5.3: Erstellen Sie zwei Datumsobjekte und verwenden Sie dann die
date_diff()
Funktion. Es wird ein PHP DateInterval- Objekt zurückgeben. siehe Dokumentationquelle
Hier ist der ausführbare Code
quelle
Ich hatte das gleiche Problem mit PHP 5.2 und löste es mit MySQL. Könnte nicht genau das sein, wonach Sie suchen, aber dies reicht aus und gibt die Anzahl der Tage zurück:
Weitere Informationen finden Sie hier http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff
quelle
Da jeder Codebeispiele veröffentlicht, ist hier eine andere Version.
Ich wollte eine Funktion, die Unterschiede von Sekunden bis Jahren anzeigt (nur eine Einheit). Für Zeiträume über 1 Tag wollte ich, dass es um Mitternacht überrollt wird (Montag um 10 Uhr ab 9 Uhr Mittwoch ist vor 2 Tagen, nicht 1). Und für Zeiträume über einen Monat wollte ich, dass der Rollover am selben Tag des Monats stattfindet (einschließlich für 30/31 Tage, Monate und Schaltjahre).
Das habe ich mir ausgedacht:
quelle
Vor einiger Zeit habe ich eine
format_date
Funktion geschrieben, da diese viele Optionen bietet, wie Sie Ihr Datum haben möchten :quelle
Sehr einfach:
Bitte überprüfen Sie den folgenden Link für Details:
PHP: date_diff - Handbuch
Beachten Sie, dass es für PHP 5.3.0 oder höher ist.
quelle
Eine einfache Funktion
Verwenden Sie wie
echo time_difference ($time_1, $time_2, "day");
Ich werde gerne wiederkommen
2 years 8 months 2 days
quelle
Versuchen Sie diese sehr einfache Antwort mit date_diff () , dies wird getestet.
Die Ausgabe ist:
quelle
Ich verwende die folgende Funktion, die ich geschrieben habe, wenn PHP 5.3 (bzw. date_diff ()) nicht verfügbar ist:
quelle
DateInterval
ist großartig, hat aber ein paar Einschränkungen:Um dies zu überwinden, habe ich Folgendes codiert (verbessert von der Antwort von @enobrev ):
Es werden zwei Schleifen ausgeführt. Das erste behandelt die relativen Intervalle (Jahre und Monate) durch Brute-Forcing, und das zweite berechnet die zusätzlichen absoluten Intervalle mit einfacher Arithmetik (also schneller):
quelle