schildi: Jahre Tage zwischen Datum

Hallo zusammen,

ich möchte unter Berücksichtigung der Schaltjahre Jahre und Tage zwischen zwei Daten ausrechnen.

Gibt es da in PHP schon fertige Funktionen oder Klassen?

Bis jetzt bin ich auf eine Möglichkeit mithilfe des Gregorianischen Kalenders gestoßen (GregorianToJD), diese rechnet die Differenz aber "nur" in Tagen aus.

Oder hat jemand eine Idee wie ich unter Berücksichtigung des Schaltjahrs  aus Tagen -> Jahre und Tage mache?

Für Tipps und Ideen wäre ich dankbar.

Mit freundlichem Gruß Jan

  1. Hi!

    ich möchte unter Berücksichtigung der Schaltjahre Jahre und Tage zwischen zwei Daten ausrechnen.
    Gibt es da in PHP schon fertige Funktionen oder Klassen?

    Alles was PHP dafür zu bieten hat ist unter Date and Time Related Extensions aufgeführt.

    Lo!

    1. Hi,

      danke für deine Antwort, mein Vorhaben ist Grundsätzlich aber schon möglich, nicht das ich mich da jetzt durch die Funktionen suche, dabei ist mein Vorhaben gar nicht möglich?

      Gruß Jan

      Hi!

      ich möchte unter Berücksichtigung der Schaltjahre Jahre und Tage zwischen zwei Daten ausrechnen.
      Gibt es da in PHP schon fertige Funktionen oder Klassen?

      Alles was PHP dafür zu bieten hat ist unter Date and Time Related Extensions aufgeführt.

      Lo!

      1. danke für deine Antwort, mein Vorhaben ist Grundsätzlich aber schon möglich, nicht das ich mich da jetzt durch die Funktionen suche, dabei ist mein Vorhaben gar nicht möglich?

        Ja. Die Differenz zweier Zeitpunkte/Daten zu ermitteln ist selbst für antike Sprachen wie VBScript eher in die Kategorie Kinderfasching einzusortieren.

        Ausreichend ist sicher ein Blick in "Date/Time Functions", damit du dir nicht alles durchsehen musst, was irgendwie mit Zeit zu tun hat.

      2. Hi!

        Bitte zitiere nur das worauf du dich beziehst und nicht einfach alles.

        mein Vorhaben ist Grundsätzlich aber schon möglich, nicht das ich mich da jetzt durch die Funktionen suche, dabei ist mein Vorhaben gar nicht möglich?

        Selbst wenn es nicht direkt möglich ist, hilft es für weitere Probleme, einen groben Überblick über die Möglichkeiten zu haben. Ob konkret dein Fall damit gelöst werden kann, kann ich dir nicht sagen, denn PHPs Datums- und Zeitfunktionen haben einen eingeschränkten Wertebereich. Innerhalb dieses Bereiches sind aber mit dem DateTime-Objekt und seiner Geschwister duchaus Differenzrechnungen möglich.

        Lo!

  2. Hallo,

    Oder hat jemand eine Idee wie ich unter Berücksichtigung des Schaltjahrs  aus Tagen -> Jahre und Tage mache?

    siehe z.B. hier:
    http://support.microsoft.com/kb/214019/de

    Gruß
    Pida

  3. Moin!

    Die Sache ist eigentlich ganz einfach, wenn man bedenkt, dass date('z') den Tag des Jahres (1.1.=0) zurückgibt. Ob es sich um ein Schaltjahr handelt verrät date('L'). Im gleichen Jahr braucht es nicht zu interessieren, weil date('z') korrekte Werte liefert. Ligen die Datumsangaben in verschiedenen Jahren muss nur untersucht werden ob das Vorjahr ein Schaltjahr ist. Da man aber dessen Tageszahl ohnehin braucht bietet sich die Lösung an, dass man diese Tageszahl direkt errechnet.

    <?php  
    error_reporting(E_ALL);  
      
    function getTimeFromIsoDatum($str) {  
      # Achtung: ohne Absicherung!  
      # gibt time-string für Iso-Datum (jeweils 00:00 Uhr zurück;  
      # (YYYY-MM-DD)  
      $ar=explode('-',$str);  
      return mktime(0, 0, 0, $ar[1], $ar[2], $ar[0]);  
    }  
      
    # Wir brauchen für date() die Zeitpunkte:  
    $datum1=getTimeFromIsoDatum('2003-02-28');  
    $datum2=getTimeFromIsoDatum('2005-03-01');  
      
      
    # Tauschen der Datumsangaben, falls Reihenfolge falsch:  
    if ($datum1 > $datum2) {  
       $tmp=$datum1;  
       $datum1=$datum2;  
       $datum2=$datum1;  
    }  
      
      
    $Jahr1=date('Y', $datum1);  
    $Jahr2=date('Y', $datum2);  
    $Tage1=date('z', $datum1); # Liefert den Tag des Jahres  
    $Tage2=date('z', $datum2); # Liefert den Tag des Jahres  
      
      
    # Hier gibt es nichts zu tun.  
    if ($Tage2 >= $Tage1) {  
      die ("Differenz: ".($Jahr2-$Jahr1)." Jahre und ".($Tage2-$Tage1)." Tag[e]\n");  
    }  
      
    # else  
    # Wenn der 2. Tag früher im Jahr liegt, dann ist von der Differenz der reinen Jahreszahlen 1 abzuziehen:  
    $diffJahre=$Jahr2-$Jahr1-1;  
      
    # Wenn diese Differenz 0 ist, dann liegen die Zeitpunkte im gleichen Jahr und es gibt nichts zu tun:  
    if (0 == $diffJahre) {  
      die ("Differenz: ".($Tage2-$Tage1)." Tag[e]\n");  
    }  
      
    # else  
    # Wir brauchen mal eben das Vorjahr und die Anzahl von dessen Tagen  
    $VorJahr=$Jahr2-1;  
    $TageVorjahr=365+date('L',mktime(0,0,0,1,1,$VorJahr)); # date('L') liefert 1 für Schaltjahr, sonst 0  
      
    # Davon ziehen wir die Tage bis zum Datum1 ab und rechnen die Tage von Datum2 hinzu:  
    $Tage=$TageVorjahr-$Tage1+$Tage2;  
      
    die ("Differenz: ".$diffJahre." Jahre und ".$Tage." Tag[e]\n");  
      
    ?>
    

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Moin!

      Tauschen der Datumsangaben, falls Reihenfolge falsch:

      if ($datum1 > $datum2) {
         $tmp=$datum1;
         $datum1=$datum2;
         $datum2=$datum1;
      }

        
      Bevor es ein anderer merkt, da hatte sich ein Fehler der Klasse "Typo aber nicht Syntax" eingeschlichen... obiges muss wie folgt notiert werden:  
        
      ~~~php
        
      # Tauschen der Datumsangaben, falls Reihenfolge falsch:  
      if ($datum1 > $datum2) {  
          $tmp=$datum1;  
          $datum1=$datum2;  
          $datum2=$tmp;  
      }  
      
      

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

  4. Hi,

    ich möchte unter Berücksichtigung der Schaltjahre Jahre und Tage zwischen zwei Daten ausrechnen.

    da kommst du unter anderem an ein Definitionsproblem:
    2008 war ein Schaltjahr. Ist der Zeitraum vom 01.02.2008 bis zum 31.01.2009 nach deiner Auffassung dann ein Jahr? Oder doch eher ein Jahr plus ein Tag (weil 366 Tage)? Ist die Länge des Kalenderjahres 2008 nicht ein Jahr plus ein Tag? Nach der technisch-astronomischen Definition ist ein Jahr dagegen ein Zeitraum vom 365.2425... Tagen.

    Ergo: Du möchtest etwas, ohne genau zu wissen, was.

    So long,
     Martin

    --
    Chef zum Bewerber: Es gibt zwei Dinge, auf die ich allergrößten Wert lege. Das eine ist Sauberkeit! Haben Sie übrigens die Schuhe auf der Matte abgetreten? - Ja, selbstverständlich. - Gut. Das andere ist uneingeschränkte Ehrlichkeit. Übrigens, draußen liegt gar keine Fußmatte.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Moin!

      Ergo: Du möchtest etwas, ohne genau zu wissen, was.

      Ach was. Er will die Differenz in Jahren und Tagen. Vermutlich will er also etwas triviales wie das Alter von Zoo- oder Haustieren ausrechnen. Jedenfalls nicht das von Sternen oder Atomen.

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

      1. Hallo,

        Ergo: Du möchtest etwas, ohne genau zu wissen, was.
        Ach was. Er will die Differenz in Jahren und Tagen. Vermutlich will er also etwas triviales wie das Alter von Zoo- oder Haustieren ausrechnen. Jedenfalls nicht das von Sternen oder Atomen.

        schon möglich, und wahrscheinlich kommt es auch nicht wirklich auf diesen Unterschied an. Ich wollte nur darauf hinweisen, dass die Aufgabenstellung nicht exakt ist.

        Dass manche Leute noch dazu ein Problem beim Zählen haben, ist eine andere Geschichte. So wie mir gestern bei der Formel1-Übertragung wieder ein klassischer ±1-Fehler bei den Einblendungen auffiel. Da stand oben am Bildschirmrand beispielsweise:
             LAP 55/57
         3 LAPS REMAINING
        Wie man leicht ausrechnen (oder eben auch auszählen kann), sind eben nicht mehr drei Runden übrig, wenn ich in Runde 55 von 57 bin, sondern nur noch zwei, nämlich Runde 56 und Runde 57. Oder zählen sie die Ehrenrunde nach der Zieldurchfahrt da auch noch mit?

        Ciao,
         Martin

        --
        Lehrer:  Wieviel ist die Hälfte von 8?
        Schüler: Kommt drauf an. Waagrecht 0 und senkrecht 3.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. [latex]Mae  govannen![/latex]

          Dass manche Leute noch dazu ein Problem beim Zählen haben, ist eine andere Geschichte. So wie mir gestern bei der Formel1-Übertragung wieder ein klassischer ±1-Fehler bei den Einblendungen auffiel. Da stand oben am Bildschirmrand beispielsweise:
               LAP 55/57
          3 LAPS REMAINING
          Wie man leicht ausrechnen (oder eben auch auszählen kann), sind eben nicht mehr drei Runden übrig, wenn ich in Runde 55 von 57 bin, sondern nur noch zwei, nämlich Runde 56 und Runde 57. Oder zählen sie die Ehrenrunde nach der Zieldurchfahrt da auch noch mit?

          $Fahrer beginnt Runde 55; Einblendung. Es sind noch zu fahren: Runde 55, Runde 56 und Runde 57. Also drei.Vollkommen logisch.

          Cü,

          Kai

          --
          Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
          Foren-Stylesheet Site Selfzeug JS-Lookup
          SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
          1. Moin!

            "Vollkommen logisch."

            Eben nicht. Es ist die perfekte Definitionsfrage: "Werden nur vollständige, noch zu fahrende Runden gezählt oder nicht?" Du sagts "Ja! Er muss ja noch auf der Runde rumröhren" - Martin sagt: "Nein! Eine halbe Runde ist eben keine ganze Runde."

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

            1. [latex]Mae  govannen![/latex]

              Eben nicht. Es ist die perfekte Definitionsfrage: "Werden nur vollständige, noch zu fahrende Runden gezählt oder nicht?" Du sagts "Ja! Er muss ja noch auf der Runde rumröhren" - Martin sagt: "Nein! Eine halbe Runde ist eben keine ganze Runde."

              Üblicherweise wechselt die Einblendung, sobald der Führende die Ziel-Linie überfährt, also genau wenn die Runde (z.B. 55) beginnt. Und dann sind eben noch 55/56/57 zu fahren.

              Cü,

              Kai

              --
              Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
              Foren-Stylesheet Site Selfzeug JS-Lookup
              SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
              1. Moin!

                Üblicherweise wechselt die Einblendung, sobald der Führende die Ziel-Linie überfährt, also genau wenn die Runde (z.B. 55) beginnt. Und dann sind eben noch 55/56/57 zu fahren.

                Nö. Ab dem Überfahren der Ziellinie sind nur noch die Runden 56,57 und der noch nicht gefahrene Teil der Runde 55 zu fahren. Es bleibt eine Frage der Definition und natürlich läuft das Ganze auf just die Kleinkrämerei hinaus welche beim Definieren von solchen Dingen halt notwendig wird.

                Man stelle sich den Spaß vor, Du hast einen Auftraggeber mit zwei Geschäftsführern und jeder der beiden hat dazu seine eigene Meinung - dann kannst Du als Entwickler nur sagen: "Ok. Einigen Sie sich und rufen Sie mich danach an."

                MFFG (Mit freundlich- friedfertigem Grinsen)

                fastix

                1. [latex]Mae  govannen![/latex]

                  Üblicherweise wechselt die Einblendung, sobald der Führende die Ziel-Linie überfährt, also genau wenn die Runde (z.B. 55) beginnt. Und dann sind eben noch 55/56/57 zu fahren.

                  Nö. Ab dem Überfahren der Ziellinie sind nur noch die Runden 56,57 und der noch nicht gefahrene Teil der Runde 55 zu fahren.

                  Ja gut, dann sind es in diesem Moment noch 2.97 Runden, wird halt aufgerundet. :)

                  Es bleibt eine Frage der Definition und natürlich läuft das Ganze auf just die Kleinkrämerei hinaus welche beim Definieren von solchen Dingen halt notwendig wird.

                  Stimmt. Da fast die gesamte Runde noch zu fahren ist, wäre die "andere" Definition zumindest für mich äußerst sinnfrei.

                  Man stelle sich den Spaß vor, Du hast einen Auftraggeber mit zwei Geschäftsführern und jeder der beiden hat dazu seine eigene Meinung - dann kannst Du als Entwickler nur sagen: "Ok. Einigen Sie sich und rufen Sie mich danach an."

                  Oder: Macht euren Scheiß doch selber *g*

                  Cü,

                  Kai

                  --
                  Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
                  Foren-Stylesheet Site Selfzeug JS-Lookup
                  SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
                  1. Moin!

                    Oder: Macht euren Scheiß doch selber *g*

                    Es gibt Situationen, da möchte man das einigen Kunden wirklich sagen.

                    Ich habe gerade einen. Ein _sehr_ kleines Emblem (8 mm breit) mit hellblauer Beschriftung (7 mm breit, 6 Großbuchstaben -> 6 Point hoch. Jetzt wundert er sich, dass bei einem Ausdruck mit einem portablen Tintenpisser (Jawoll! Und auch noch wenn man es faxt!) einem der Buchstaben ein Beinchen fehlt...

                    Der Druckertreiber sagt sich nämlich: Eine hellblaue Linie die keinen meiner Pixel dick ist, die ist so hellgrau, dass ich sie gar nicht erst drucke.

                    Wenn der jetzt kommt und sich darüber aufregt, dass ich das Blau zu dunkel gemacht habe, dann sage ich das obige.

                    MFFG (Mit freundlich- friedfertigem Grinsen)

                    fastix

                2. Üblicherweise wechselt die Einblendung, sobald der Führende die Ziel-Linie überfährt, also genau wenn die Runde (z.B. 55) beginnt. Und dann sind eben noch 55/56/57 zu fahren.

                  Nö. Ab dem Überfahren der Ziellinie sind nur noch die Runden 56,57 und der noch nicht gefahrene Teil der Runde 55 zu fahren.

                  Es werden nur ganze Runden angezeigt, das kann nur einen Moment lang genau sein. Die Einbledung gilt für den Moment bei dem die Ziellinie überfahren wird und wird innerhalb der Runde nicht aktuallisiert.

          2. Hi,

            Wie man leicht ausrechnen (oder eben auch auszählen kann), sind eben nicht mehr drei Runden übrig, wenn ich in Runde 55 von 57 bin, sondern nur noch zwei, nämlich Runde 56 und Runde 57.
            $Fahrer beginnt Runde 55; Einblendung. Es sind noch zu fahren: Runde 55, Runde 56 und Runde 57. Also drei.Vollkommen logisch.

            eben nicht, wie fastix ja schon ausgeführt hat: Da eine dieser drei Runden schon begonnen wurde, sind es eben nicht mehr drei *ganze* Runden, sondern weniger als drei.

            Ciao,
             Martin

            --
            Früher habe ich mich vor der Arbeit gedrückt, heute könnte ich stundenlang zusehen.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        2. LAP 55/57
          3 LAPS REMAINING
          Wie man leicht ausrechnen (oder eben auch auszählen kann), sind eben nicht mehr drei Runden übrig, wenn ich in Runde 55 von 57 bin, sondern nur noch zwei, nämlich Runde 56 und Runde 57. Oder zählen sie die Ehrenrunde nach der Zieldurchfahrt da auch noch mit?

          Es sind nicht 55 von 57 Runden gefahren, sondern es ist/läuft die 55 von 57 Runden, richtig. Es sind nicht noch drei vollständige Runden zu fahren (wer hat das gesagt?), es sind noch drei Runden zu fahren bzw. zu beenden ("verbleibend" ist da nicht konkreter). Man kann auch sagen, es sind noch drei ganze Runden zu fahren (es werden nur ganze gezählt/angezeigt), die erste davon hat man noch nicht ganz gefahren.

    2. ich möchte unter Berücksichtigung der Schaltjahre Jahre und Tage zwischen zwei Daten ausrechnen.

      da kommst du unter anderem an ein Definitionsproblem:
      2008 war ein Schaltjahr. Ist der Zeitraum vom 01.02.2008 bis zum 31.01.2009 nach deiner Auffassung dann ein Jahr?

      Vermutlich.

      Aber was ist mit folgenden Zeiträumen:
      28.02.2007 - 28.02.2008
      28.02.2007 - 29.02.2008
      28.02.2007 - 01.03.2008
      ?