Michael B.: Zeitunterschied

Hallo!

Ich hab mir jetzt zwanzig Minuten die PHP Seite zu den Datum- und Zeitfunktionen angeschaut und komm einfach nicht dahinter wie so was geht:

Sagen wir mal ich hab ein Datum im YYYY-MM-DD - Format. Jetzt möchte ich gern überprüfen, ob seitdem ein gewisser Zeitraum vergangen ist - 12 Monate z.B.

Ich hatte folgenden Ansatz:

$datum="2007-07-14";

$unterschied = mktime(date("Y-m-d")) - mktime($datum);

Jetzt hab ich nen Unterschied, aber scheinbar nicht den richtigen - der berücksichtigt nämlich nicht die Monate bzw. Tage.
Und wenn ich den richtigen hab, wie wandel ich das ganze in Monate um?

mfg
Michael B.

  1. Hello out there!

    Ich hab mir jetzt zwanzig Minuten die PHP Seite zu den Datum- und Zeitfunktionen angeschaut [...]

    $datum="2007-07-14";
    $unterschied = mktime(date("Y-m-d")) - mktime($datum);

    In der Beschreibung von mktime() steht doch, welche Parameter die Funktion erwartet.

    See ya up the road,
    Gunnar

    --
    „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
  2. Ahoi Michael B.,

    Ich hatte folgenden Ansatz:
    $datum="2007-07-14";
    $unterschied = mktime(date("Y-m-d")) - mktime($datum);

    vll hilft dir euch ein http://de.php.net/manual/de/function.strtotime.php

    $datum="2007-07-14";
    $unterschied = date("Y-m-d", time()-strtotime($datum));

    MfG

  3. Hallo

    Sagen wir mal ich hab ein Datum im YYYY-MM-DD - Format. Jetzt möchte ich gern überprüfen, ob seitdem ein gewisser Zeitraum vergangen ist - 12 Monate z.B.

    Ich hatte folgenden Ansatz:

    $datum="2007-07-14";

    $unterschied = mktime(date("Y-m-d")) - mktime($datum);

    ich persönlich halte es für eine dschlechte Idee, Tages-, Monats- oder Jahrdifferenzen über UNIX-Timestamps zu berechnen, wenn die Ausgangsdaten in einem tagesgenauen Format vorliegen.

    Jetzt hab ich nen Unterschied, aber scheinbar nicht den richtigen - der berücksichtigt nämlich nicht die Monate bzw. Tage.

    Und wenn ich den richtigen hab, wie wandel ich das ganze in Monate um?

    Gar nicht, das ist viel zu kompliziert. Du musst berücksichtigen, das Monate unterschiedlich viele Tage haben und ein bestimmter Monat noch dazu unterschiedlich viele Tage, je nachdem, was für ein Jahr gerade ist.

    Vorschlag:
    Differenz in Tagen:
    Verwende die Differenz des Julianischen Tages, siehe Kalender-Funktionen, speziell
    cal_to_jd().

    Differenz in ganzen Jahren:

    Differenz = Differenz der Jahresanteile
    Wenn der Monats- und Taganteil des neueren Datums kleiner ist als der des alten
        Differenz = Differenz - 1
    Ende Wenn

    Differenz in Monaten:
    Differenz der Monate = (Monat neueres Datum + 12 - Monat älteres Datum) modulo 12
    Wenn Taganteil des neueren Datums kleiner ist als der des alten
        Differenz der Monate = Differenz der Monate - 1
    Ende Wenn
    Differenz = Differenz in ganzen Jahren * 12 + Differenz der Monate

    Beispiele:
    2007-06-14 und 2000-12-03

    Differenz in Jahren:
    Differenz = 7 (2007 - 2000)
    Da 06-14 kleiner ist als 12-03
    Differenz = 6 (7-1)

    Differenz in Monaten:
    Berechne Differenz der Monate
    (6 + 12 - 12) % 12 = 6
    Da 14 größer ist als 03 bleibt es bei 6
    => Differenz = 6 + 12 * 6 = 78 Monate

    Damit erledigen sich alle Probleme mit der unterschiedlichen Monatslänge und auch der Sommerzeit.

    Freundliche Grüße

    Vinzenz

    1. Hello out there!

      ich persönlich halte es für eine dschlechte Idee, Tages-, Monats- oder Jahrdifferenzen über UNIX-Timestamps zu berechnen

      Warum? Damit ersparst du dir die einzelnen Subtraktionen und vor allem die Beachtung des Übertrags von Tagen auf Monate und von Monaten auf Jahre.

      Das Ergebnis der Differenz zweier Timestamps ist die Zeitdauer in einer bestimmten Einheit, die sich problemlos in die gewünschte Einheit umrehnen lässt.

      See ya up the road,
      Gunnar

      --
      „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
      1. hi,

        ich persönlich halte es für eine dschlechte Idee, Tages-, Monats- oder Jahrdifferenzen über UNIX-Timestamps zu berechnen

        /me too

        Warum? Damit ersparst du dir die einzelnen Subtraktionen und vor allem die Beachtung des Übertrags von Tagen auf Monate und von Monaten auf Jahre.

        Und kommst ggf. in Schwulitäten mit unterschiedlichen Uhrzeiten, Zeitumstellung o.ä.

        Das Ergebnis der Differenz zweier Timestamps ist die Zeitdauer in einer bestimmten Einheit, die sich problemlos in die gewünschte Einheit umrehnen lässt.

        Kommt drauf an, was man haben will.

        Nimm von Heute aus betrachtet mal bspw. den 24. Januar 2005.
        Der wäre, m.E. und nach "menschlicher" Zählweise, zwei Jahre, vier Monate und 21 Tage her.
        Wie ermittelst du so eine Angabe durch Subtraktion von Unix-Timestamps?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. ich persönlich halte es für eine dschlechte Idee, Tages-, Monats- oder Jahrdifferenzen über UNIX-Timestamps zu berechnen

        ACK.

        Warum? Damit ersparst du dir die einzelnen Subtraktionen und vor allem die Beachtung des Übertrags von Tagen auf Monate und von Monaten auf Jahre.

        Monate haben aber nunmal verschiedene Längen. Zwischen dem 31.01. und dem 01.03. liegen genauso (ohne Schaltjahr) 29 Tage wie zwischen dem 01.03. und dem 29.04. Im ersten Fall wäre das 1 Monat, im zweiten Fall nicht.

        Das Ergebnis der Differenz zweier Timestamps ist die Zeitdauer in einer bestimmten Einheit, die sich problemlos in die gewünschte Einheit umrehnen lässt.

        Nur, solange der Umrechnungsfaktor unveränderlich ist (also bis zur Einheit "Tage").

        Siechfred

        --
        Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
    2. Versteh ich nicht; bin ich zu blöd für.
      Kannst du das bitte in Quelltext ausdrücken?

      Mit welchen Anweisungen komm ich denn an die "Zahlen"??

      Hallo

      Sagen wir mal ich hab ein Datum im YYYY-MM-DD - Format. Jetzt möchte ich gern überprüfen, ob seitdem ein gewisser Zeitraum vergangen ist - 12 Monate z.B.

      Ich hatte folgenden Ansatz:

      $datum="2007-07-14";

      $unterschied = mktime(date("Y-m-d")) - mktime($datum);

      ich persönlich halte es für eine dschlechte Idee, Tages-, Monats- oder Jahrdifferenzen über UNIX-Timestamps zu berechnen, wenn die Ausgangsdaten in einem tagesgenauen Format vorliegen.

      Jetzt hab ich nen Unterschied, aber scheinbar nicht den richtigen - der berücksichtigt nämlich nicht die Monate bzw. Tage.

      Und wenn ich den richtigen hab, wie wandel ich das ganze in Monate um?

      Gar nicht, das ist viel zu kompliziert. Du musst berücksichtigen, das Monate unterschiedlich viele Tage haben und ein bestimmter Monat noch dazu unterschiedlich viele Tage, je nachdem, was für ein Jahr gerade ist.

      Vorschlag:
      Differenz in Tagen:
      Verwende die Differenz des Julianischen Tages, siehe Kalender-Funktionen, speziell
      cal_to_jd().

      Differenz in ganzen Jahren:

      Differenz = Differenz der Jahresanteile
      Wenn der Monats- und Taganteil des neueren Datums kleiner ist als der des alten
          Differenz = Differenz - 1
      Ende Wenn

      Differenz in Monaten:
      Differenz der Monate = (Monat neueres Datum + 12 - Monat älteres Datum) modulo 12
      Wenn Taganteil des neueren Datums kleiner ist als der des alten
          Differenz der Monate = Differenz der Monate - 1
      Ende Wenn
      Differenz = Differenz in ganzen Jahren * 12 + Differenz der Monate

      Beispiele:
      2007-06-14 und 2000-12-03

      Differenz in Jahren:
      Differenz = 7 (2007 - 2000)
      Da 06-14 kleiner ist als 12-03
      Differenz = 6 (7-1)

      Differenz in Monaten:
      Berechne Differenz der Monate
      (6 + 12 - 12) % 12 = 6
      Da 14 größer ist als 03 bleibt es bei 6
      => Differenz = 6 + 12 * 6 = 78 Monate

      Damit erledigen sich alle Probleme mit der unterschiedlichen Monatslänge und auch der Sommerzeit.

      Freundliche Grüße

      Vinzenz

      1. hi,

        zitiere bitte sinnvoll.

        Versteh ich nicht; bin ich zu blöd für.
        Kannst du das bitte in Quelltext ausdrücken?

        if(empty($knowledge)) {
          pay_for($solution);
        }

        Mit welchen Anweisungen komm ich denn an die "Zahlen"??

        An welche?
        Wenn du schon selbst nicht klarkommst - dann stelle bitte wenigstens verständliche und präzise Fragen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. Hallo Michael,

        bitte kein TOFU.

        Mit welchen Anweisungen komm ich denn an die "Zahlen"??

        zum Beispiel mit explode().

        Aus meiner Beschreibung mit folgendem Codefragment solltest Du das hinbekommen:

          
            $datum = '2007-06-14';          # Datum im von Dir vorgegebenen Format  
            $teile = explode('-', $datum);  # Trenne am Bindestrich  
          
            # Schau Dir nun den Inhalt der Variablen $teile an:  
            # (ein Array mit drei Elementen)  
            echo '<pre>';  
            print_r($teile);  
            echo '</pre>';  
        
        

        Differenz in ganzen Jahren:

        Differenz = Differenz der Jahresanteile
        Wenn der Monats- und Taganteil des neueren Datums kleiner ist als der des alten
            Differenz = Differenz - 1
        Ende Wenn

        Zuweisung der Differenz zweier Zahlen (die Du durch explode erhalten kannst)
        an eine Variable.
        Danach eine bedingte Ausführung (sprich eine if-Anweisung ohne else-Zweig). Hier kannst Du sogar den Dekrementoperator -- anwenden.

        Ist das wirklich so schwer zu verstehen?

        Freundliche Grüße

        Vinzenz

        1. Hab das ganze mitlerweile selbst gelöst. Eine absolut genaue Rechnung ist eh nicht nötig, wenn man in Maßstäben rechnet wie 12 Monate o.ä. Geht ja dann nur grob um den Monat und den Zeitraum im Monat. Da das ganze ab 2 Jahren aufwärts völlig uninteressant ist, kann man wohl mit dem bisschen an Abweichung rechnen.

          $datum=getdate(strtotime($inhalt));
          $heute=getdate(time());
          $jahre = $heute[year]-$datum[year];
          $monate = ($heute[mon]-$datum[mon]) + $jahre*12;
          if(($heute[mday]-$datum[mday])<0) $monate--;
          echo " (vor $monate Monaten)";