Friedel: Problem mit date('j\.n\.Y', mktime ( 0, 0, 0, 2,date("t"), 2020));

Hallo,

ich bastle seit Stunden am Grundgerüst für einen Kalender und stolpere immer wieder über unerwartete und falsche Ergebnisse, wenn ich berechne, wie viele Wochen der jeweilige Monat hat. Also habe ich meine Berechnung in viele kleine Einzelschritte zerlegt und lasse mir alle möglichen Zwischenergebnisse anzeigen.

echo date('j\.n\.Y', mktime ( 0, 0, 0, 2,date("t"), 2020));

sollte imho die Ausgabe

29.2.2020

erzeugen. Es erzeugt aber

1.3.2020

Warum???

  1. OK. Ich sollte Feierabend machen. date(t) ist natürlich nicht die Zahl der Tage des jeweiligen Monats, sondern die Zahl der Tage von DIESEM Monat…

    1. n'Abend,

      Offensichtlich macht das t bei date("t") nicht das, was ich dachte.

      doch, ich denke schon.

      Laut https://www.php.net/manual/de/function.date.php sollte das die Anzahl der Tage des Monats zurückgeben.

      Ja, aber das funktioniert nur, wenn das übergebene Datum auch im richtigen Monat liegt. Bedenke, dass date() den Timestamp in der lokalen Zeitzone wiedergibt, während mktime() einen Timestamp in UTC liefert. Dazwischen liegen derzeit zwei Stunden (im Winterhalbjahr nur eine).

      Live long and pros healthy,
       Martin

      --
      Paradox: Wieso heißen die Dinger Kühlkörper, obwohl sie höllisch heiß werden?
      1. Tach!

        Laut https://www.php.net/manual/de/function.date.php sollte das die Anzahl der Tage des Monats zurückgeben.

        Ja, aber das funktioniert nur, wenn das übergebene Datum auch im richtigen Monat liegt.

        Dazu muss man aber auch ein Datum übergeben, was der OP nicht getan hat, und somit immer die Werte vom aktuellen Zeitpunkt bekam. In seinem korrigierten Posting hat er das schon festgestellt.

        Bedenke, dass date() den Timestamp in der lokalen Zeitzone wiedergibt, während mktime() einen Timestamp in UTC liefert. Dazwischen liegen derzeit zwei Stunden (im Winterhalbjahr nur eine).

        Der (Unix-)Timestamp ist immer eine zu UTC relative Anzahl von Sekunden. Ob man mit date()/mktime() oder gmdate()/gmmktime() arbeitet, spielt dabei keine Rolle. date() gibt jedoch das Ergebnis für die konfigurierte Zeitzone aus, und mktime() nimmt solche Werte entgegen. Die gm-Funktionen hingegen geben und nehmen UTC-Werte.

        dedlfix.

        1. @@dedlfix

          Die gm-Funktionen hingegen geben und nehmen UTC-Werte.

          Weshalb sie auch mit gm… benannt sind. 🤦‍♂️

          😷 LLAP

          --
          „Sag mir, wie Du Deine Maske trägst, und ich sage Dir, ob Du ein Idiot bist.“ —@Ann_Waeltin
          1. Hallo Gunnar,

            Die gm-Funktionen hingegen geben und nehmen UTC-Werte.

            Weshalb sie auch mit gm… benannt sind. 🤦‍♂️

            Greenwich Mean Time:

            „Die Greenwich Mean Time war von 1884 bis 1928 Weltzeit, in dieser Funktion wurde sie 1972 von der Koordinierten Weltzeit (UTC) abgelöst.“

            1972, Kinder wie die Zeit vergeht.

            Gruß
            Jürgen

            1. @@JürgenB

              Die gm-Funktionen hingegen geben und nehmen UTC-Werte.

              Weshalb sie auch mit gm… benannt sind. 🤦‍♂️

              Greenwich Mean Time:

              Ja, schon klar. Aber:

              “English speakers often use GMT as a synonym for Coordinated Universal Time (UTC). For navigation, it is considered equivalent to UT1 (the modern form of mean solar time at 0° longitude); but this meaning can differ from UTC by up to 0.9 s. The term GMT should not thus be used for certain technical purposes requiring precision.” [fast ebenda]

              Und just to prove the point gleich rechts daneben in der Legende zur Grafik:
              “Greenwich Mean Time (UTC)” 🤣

              😷 LLAP

              --
              „Sag mir, wie Du Deine Maske trägst, und ich sage Dir, ob Du ein Idiot bist.“ —@Ann_Waeltin
  2. Hallo Friedel,

    wenn Du den letzten Tag des Monats $monat (1..12) im Jahr $jahr bestimmen willst, dann ist

    $lastDay = mktime(0, 0, 0, $monat+1, 0, $jahr);
    

    die einfachere Lösung. Das funktioniert auch im Dezember, mktime(0,0,0,13,0,2020) liefert brav 31.

    Ob Du nun die Funktionen für lokale Zeit oder Greenwich-Zeit verwendest, ist egal. Du musst nur darauf achten, dass Du bei einer Funktionenfamilie bleibt.

    Und natürlich ist diese Rechnung nicht atomar. D.h. wenn Du deine Berechnung exakt zum Umschaltzeitpunkt zwischen Winter- und Sommerzeit ausführst, oder wenn der NTP Dienst die Serverzeit korrigiert, dann kann Dir ein blöder Server dazwischengrätschen und die Zeit zwischen zwei Funktionsaufrufen um eine Stunde verstellen. Ob weniger blöde Server automatisch dafür sorgen, dass während einer solchen Zeitkorrektur keine Webrequests bearbeitet werden, oder zumindest während der Verarbeitung eines Requests die Korrektur für PHP nicht sichtbar ist, weiß ich nicht. Würde mich aber interessieren - weiß das jemand?

    Rolf

    --
    sumpsi - posui - obstruxi