Linuchss: php: Tage-Nachkommastellen zwischen zwei Datümern über die Zeitumstellung

Moin,

ich habe eine Zeitspanne zu berechnen zwischen tag_von und tag_bis, beide in der Form jjjj-mm-tt (mysql date)

Mit der Formel

$tage = ( strtotime( "2019-10-15" ) - strtotime( "2019-08-22" ) ) /86400;

erhalte ich 54.

Beim tag_bis = "2019-12-02" erhalte ich 102.04166666667.

Die 4.../100stel Tage sind wohl die zusätzliche Stunde wegen der Zeitumstellung und ich könnte runden.

Aber kann php auch eine genaue Angabe machen zwischen zwei Datümern?

Gruß Linuchs

EDIT: Woher kennt php eigentlich die recht willkürliche, gesetzliche Zeitumstellung? So weit ich weiß, ist PHP fest auf meinem Server und fragt nicht bei Gesetzestexten nach. Wäre die Berechnung falsch, wenn sich die Rechtslage ändert?

  1. Hello,

    Du könntest das doch mig date() zurückwandeln in Tage oder was Du eben benötigst.

    Und es gibt da noch date_diff()

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Du könntest das doch mig date() zurückwandeln in Tage oder was Du eben benötigst.

      War auch meine erste Idee. Aber mit welchem Character bei date() kannst du die Tages-Anzahl der angegebenen Sekunden abfragen? In der Doku lese ich d day of the month, z day of the year, N day of the week, ...

      Habe ich in der Doku was übersehen?

    2. Und es gibt da noch date_diff()

      Schau rein in die Doku, das basiert auf datetime, also wieder auf Sekunden.

      Ich probiere:

      echo date_diff( "2019-10-15", "2019-12-02"  );
      

      Warning: date_diff() expects parameter 1 to be DateTimeInterface, string given in /home/osmer/domains/remso.de/public_html/500/p591b.php on line 114

      also nochmal:

      echo date_diff( strtotime("2019-10-15"), strtotime("2019-12-02")  );
      

      Warning: date_diff() expects parameter 1 to be DateTimeInterface, integer given in /home/osmer/domains/remso.de/public_html/500/p591b.php on line 114

      dritter Versuch mit datetime:

      echo date_diff( "2019-10-15 00:00:00", "2019-12-02 00:00:00" );
      

      Warning: date_diff() expects parameter 1 to be DateTimeInterface, string given in /home/osmer/domains/remso.de/public_html/500/p591b.php on line 114

      vierter Versuch:

      echo date_diff( strtotime("2019-10-15 00:00:00"), strtotime("2019-12-02 00:00:00") );
      

      Warning: date_diff() expects parameter 1 to be DateTimeInterface, integer given in /home/osmer/domains/remso.de/public_html/500/p591b.php on line 114

      Was zum Teufel ist DateTimeInterface?

      1. Hallo

        Was zum Teufel ist DateTimeInterface?

        lmsiitphpdocfy [1]: date_diff => ist Alias von dateTime::diff => folge einem der bei jeder Erwähnung von DateTimeInterface vorhandenen Links zu DateTimeInterface.

        Tschö, Auge

        --
        Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
        Hohle Köpfe von Terry Pratchett

        1. Let me search it in the PHP documentation for you ↩︎

      2. Lieber Linuchss,

        Warning: date_diff() expects parameter 1 to be DateTimeInterface, string given in /home/osmer/domains/remso.de/public_html/500/p591b.php on line 114 [...] Was zum Teufel ist DateTimeInterface?

        Du benötigst zwei DateTime-Objekte, die Du dieser Funktion füttern musst. Beispiel (gekürzt) von StackOverflow:

        $date1 = new DateTime("2007-03-24");
        $date2 = new DateTime("2009-06-26");
        $interval = $date1->diff($date2);
        echo "difference " . $interval->days . " days ";
        

        Liebe Grüße

        Felix Riesterer

  2. Hallo,

    ich habe eine Zeitspanne zu berechnen

    Wenn ich auf php.net strtotime nachschlage, finde ich folgenden Hinweis:

    Hinweis:
    Die Verwendung dieser Funktion für mathematische Berechnungen ist nicht zu empfehlen. Es ist besser DateTime::add() und DateTime::sub() in PHP 5.3 und neuer, oder DateTime::modify() in PHP 5.2 zu verwenden.

    Gruß
    Kalk

  3. Hallo,

    Mit der Formel

    $tage = ( strtotime( "2019-10-15" ) - strtotime( "2019-08-22" ) ) /86400;
    

    erhalte ich 54.

    Beim tag_bis = "2019-12-02" erhalte ich 102.04166666667.

    Die 4.../100stel Tage sind wohl die zusätzliche Stunde wegen der Zeitumstellung und ich könnte runden.

    ja, richtig vermutet.

    Aber kann php auch eine genaue Angabe machen zwischen zwei Datümern?

    Die Angabe ist genau. ;-)
    Wenn du sie nicht so genau willst, ist Runden ein brauchbarer Ansatz. Ein anderer wäre, die beiden Datumsangaben auf ein locale zu beziehen, das keine Sommer/Winter-Umstellung kennt, am besten UTC.

    EDIT: Woher kennt php eigentlich die recht willkürliche, gesetzliche Zeitumstellung?

    Vom Betriebssystem. Windows kennt die Zeitpunkte der Umstellung ja auch und stellt danach automatisch die Uhr um. Linux stellt zwar nicht die Uhr um (die läuft immer auf UTC), aber den Offset, mit dem zwischen UTC und Local Time umgerechnet wird.

    So weit ich weiß, ist PHP fest auf meinem Server und fragt nicht bei Gesetzestexten nach. Wäre die Berechnung falsch, wenn sich die Rechtslage ändert?

    Nein. Dann wäre in wenigen Tagen ein aktualisiertes tzdata-Modul verfügbar, das der Server-Admin einspielen würde.

    Ciao,
     Martin

    --
    Computer müssen weiblich sein: Eigensinnig, schwer zu durchschauen, immer für Überraschungen gut - aber man möchte sie nicht missen.
  4. Tach!

    Aber kann php auch eine genaue Angabe machen zwischen zwei Datümern?

    Das kommt darauf an, was du als genaue Angabe verstehst. Da sich die Zeitangaben auf Sekunden beziehen, ist bei Zeitumstellung jedenfalls mehr oder weniger als ein Tag vorhanden. Rechne mit UTC, wenn du keine lokalen Zeitzonenwechsel in der Rechnung haben möchtest. Dafür gibt es drei gm*-Funktionen, aber kein Pendant für strtotime(). Und es gibt auch date_timezone_set().

    EDIT: Woher kennt php eigentlich die recht willkürliche, gesetzliche Zeitumstellung?

    Aus der Zeitzonendatenbank deines Betriebssystems und dem Konfigurationswert für deine Zeitzone.

    So weit ich weiß, ist PHP fest auf meinem Server und fragt nicht bei Gesetzestexten nach. Wäre die Berechnung falsch, wenn sich die Rechtslage ändert?

    Ja, wenn du die Zeitzonendatenbank deines Systems nicht aktualisierst.

    dedlfix.

  5. Woher kennt php eigentlich die recht willkürliche, gesetzliche Zeitumstellung? So weit ich weiß, ist PHP fest auf meinem Server und fragt nicht bei Gesetzestexten nach. Wäre die Berechnung falsch, wenn sich die Rechtslage ändert?

    PHP macht das nicht selbst sondern "wrappt" wie bei vielen anderen Funktionen auch die "C standard library", fragt also einfach eine mehr (jeder Hersteller eines gebrächlichen OS liefert sowas mit) oder weniger (einem OS selbst können, wenn man es eng sieht, Zeitzonen eigentlich egal sein) zu jedem OS gehörende Bibliothek ab. Unter Linux ist das:

    Paket: tzdata

    Zeitzonen- und Sommerzeit-Daten

    Dieses Paket enthält Daten, die für die Implementierung der lokalen Zeit vieler repräsentativer Orte auf der ganzen Welt benötigt werden. Es wird periodisch aktualisiert, um Änderungen durch politische Gremien an Zeitzonen-Grenzen, UTC-Versätzen und Sommerzeit-Regelungen wiederzugeben.

    Hinter dem "vieler repräsentativer Orte auf der ganzen Welt" verbirgt sich praktisch jeder Ort, sogar Stationen auf der Antaktis.

    Wäre die Berechnung falsch, wenn sich die Rechtslage ändert?

    Kommt drauf an, ob Du Dein System aktuell hältst. Als Russland anno 2011 zunächst die damalige "Sommerzeit" und ab 2014 die "Winterzeit" als gesetzliche Zeit für alle Jahreszeiten (also ohne die vorherige Umstellung) einführte hatten diejenigen (zeitweise) Probleme, welche nicht mindestens einmal im Monat Updates abholten.