PHP Zeitspanne Monate, Tage

Hi @ alle :wink:

Ich suche nun schon seit 'ner halben Ewigkeit danach:
Ich brauche ein Script in PHP, welches mir eine Zeitspanne zwischen dem Datum x und dem Datum y ausgibt und zwar nicht in Sekunden (das wäre ja leicht mit dem Timestamp zu erreichen) sondern in Jahren, Monaten und Tagen.

Also Beispielsweise so:

Datum x: 29.03.2008
Datum y: 12.02.2009

Ausgabe:
  Jahre: 0
  Monate: 10
  Tage: 14

Ich wäre um jede Hilfe sehr, sehr dankbar!

viele Grüße,

Marco

Hi Marco,

Ich suche nun schon seit 'ner halben Ewigkeit danach:
Ich brauche ein Script in PHP, welches mir eine Zeitspanne
zwischen dem Datum x und dem Datum y ausgibt und zwar nicht in
Sekunden (das wäre ja leicht mit dem Timestamp zu erreichen)
sondern in Jahren, Monaten und Tagen.

warum schreibst Du Dir dann nicht einfach selbst eins?
Dann kannst Du sogar noch alle Finessen einbauen, die Du gerne noch reinhaben willst…

Ich wäre um jede Hilfe sehr, sehr dankbar!

http://www.php.net

Grüße
Munich

Hallo

Wir haben heute den 17. September. Eine Zeitspanne von drei Monaten und 20 Tagen kann bedeuten:

Ein Monat bedeutet dreißig Tage, das wären also 110 Tage, damit wären wir beim 5. Januar 2010.

Zum heutigen Datum 20 Tage dazu und dann die Monatszahl noch um 3 vergrößern. Dann wären wir beim 7. Januar.

Oder die Monatszahl des heutigen Datums um 3 vergrößern und dann noch 20 Tage dazu. Das wäre dann der 6. Januar.

Ich nehme mal an dass du die dritte Variante meinst.
Die Berechnung erfolgt wie bei schriftlicher Division. Allerdings weiß man da dass man bei „7 - 9“ „17 - 9“ zu rechnen hat, man erhält 8 merke 1.
Wenn man mit Tagen rechnet, muss man allerdings beachten, wie viel Tage der vorletzte Monat im Zeitraum hat. Ist das ein Januar (wie im Beispiel), dann bedeutet „12 - 29“ „(12 + 31) - 29“ und man bekommt 14 merke 1. Ist der vorletzte Monat dagegen ein Februar, so muss man rechnen „(12 + 28) - 29“ und erhält 11 merke 1. Falls das jetzt aber ein Schaltjahr ist…

$datum1 = '29.03.2008';
$datum2 = '12.02.2009';

$da1 = explode('.',$datum1);
$da2 = explode('.',$datum2);

//Daten tauschen, wenn Datum 1 nach Datum 2 liegt.
if ($da2[2].$da2[1].$da2[0] ";
echo "Monate: ".$monate."
";
echo "Jahre: ".$jahre."
";

Johannes

Ich nehme mal an dass du die dritte Variante meinst.
Die Berechnung erfolgt wie bei schriftlicher Division.
Allerdings weiß man da dass man bei „7 - 9“ „17 - 9“ zu
rechnen hat, man erhält 8 merke 1.
Wenn man mit Tagen rechnet, muss man allerdings beachten, wie
viel Tage der vorletzte Monat im Zeitraum hat. Ist das ein
Januar (wie im Beispiel), dann bedeutet „12 - 29“ „(12 + 31) -
29“ und man bekommt 14 merke 1. Ist der vorletzte Monat
dagegen ein Februar, so muss man rechnen „(12 + 28) - 29“ und
erhält 11 merke 1. Falls das jetzt aber ein Schaltjahr ist…

$datum1 = ‚29.03.2008‘;
$datum2 = ‚12.02.2009‘;

$da1 = explode(’.’,$datum1);
$da2 = explode(’.’,$datum2);

//Daten tauschen, wenn Datum 1 nach Datum 2 liegt.
if ($da2[2].$da2[1].$da2[0] ";
echo "Monate: „.$monate.“
";
echo "Jahre: „.$jahre.“
";

Johannes

Hi^^

Ja genau - die dritte habe ich gemeint. An die anderen habe ich gar nicht gedacht… sorry :smiley:

Also erst mal DANKE!!! Es funktioniert.
Ich hatte schon rumexperimentiert und bin auf ein ähnliches Script gekommen aber es hat mir genau hier gefehlt:

$da2[1]--; $tage+=
date('t',strtotime($da2[1].'/'.$da2[0].'/'.$da2[2]));}

Ich bin einfach nicht auf die Idee gekommen, date(‚t‘) zu nehmen…

Danke vielmals für deine Hilfe - Hat wahrscheinlich einiges an Zeit gebraucht…

VIELEN VIELEN DANK (:

grüße,

Marco

Hallo

Wir haben heute den 17. September. Eine Zeitspanne von drei
Monaten und 20 Tagen kann bedeuten:

Ein Monat bedeutet dreißig Tage, das wären also 110 Tage,
damit wären wir beim 5. Januar 2010.

Zum heutigen Datum 20 Tage dazu und dann die Monatszahl noch
um 3 vergrößern. Dann wären wir beim 7. Januar.

Oder die Monatszahl des heutigen Datums um 3 vergrößern und
dann noch 20 Tage dazu. Das wäre dann der 6. Januar.

Ich nehme mal an dass du die dritte Variante meinst.
Die Berechnung erfolgt wie bei schriftlicher Division.
Allerdings weiß man da dass man bei „7 - 9“ „17 - 9“ zu
rechnen hat, man erhält 8 merke 1.
Wenn man mit Tagen rechnet, muss man allerdings beachten, wie
viel Tage der vorletzte Monat im Zeitraum hat. Ist das ein
Januar (wie im Beispiel), dann bedeutet „12 - 29“ „(12 + 31) -
29“ und man bekommt 14 merke 1. Ist der vorletzte Monat
dagegen ein Februar, so muss man rechnen „(12 + 28) - 29“ und
erhält 11 merke 1. Falls das jetzt aber ein Schaltjahr ist…

du brauchst mehr ifs :smile:

31.01.2009 - 01.03.2009
Tage: -2
Monate: 1
Jahre: 0
31.01.2009 - 28.03.2009
Tage: 25
Monate: 1
Jahre: 0

Hey, hier denkt einer mit.
Ich glaube, ich gebe dir in Zukunft öfter mal Code zum drüberschauen. :wink:

31.01.2009 - 01.03.2009
Tage: -2
Monate: 1
Jahre: 0

Das Problem ist leicht zu lösen, z.B. in dem man die Zeile

if ($tage verdoppelt.



> 31.01.2009 - 28.03.2009  
> Tage: 25  
> Monate: 1  
> Jahre: 0

Hier stellt sich die Frage was eigentlich die richtige Lösung ist.
Man könnte sagen von Ende Januar bis Ende Februar (also bis zum 28.) sind es zwei Monate, und dann kommen noch 28 März-Tage.
Aber was macht man z.B. bei 29.01.2009 - 28.03.2009?
Sind das auch ein Monat und 28 Tage? Oder doch eher ein Monat und 30 Tage?
Ich weiß es nicht.

Johannes

Hey, hier denkt einer mit.

das thema ist nicht trivial, da kann man mal ein auge werfen.

Ich glaube, ich gebe dir in Zukunft öfter mal Code zum
drüberschauen. :wink:

nimm phpunit

31.01.2009 - 28.03.2009
Tage: 25
Monate: 1
Jahre: 0

Hier stellt sich die Frage was eigentlich die richtige Lösung
ist.

da hast du recht, aber 1m25d auf keinen fall.

Das PHP-Manual gibt für PHP >= 5.3 folgende Möglichkeit an:

$oDT = new DateTime('31-01-2009');
$oDTDiff = $oDT-\>diff(new DateTime('28-03-2009'));
echo $oDTDiff-\>format('%d Tage, %m Monate, %y Jahre');

Wäre mal interessant was da rauskommt, aber ich hab nur PHP 5.2.6.

Johannes