André: PHP +7 day

Hallo,

geht die Rechnung auch einfacher?

$date  = $array['NummerDatum'];
$date  = strtotime($date);
$date  = strtotime("+7 day", $date);
$datum = date("d.m.Y", $date);

Im Feld $array['NummerDatum']; steht z.B. dieser Wert 2016-04-01

  1. Hi,

    geht die Rechnung auch einfacher?

    aber selbstverständlich - vorausgesetzt, ich habe richtig verstanden, was du willst: Du hast einen Timestamp als String vorliegen, und willst den Zeitpunkt exakt eine Woche später?

    Dann mach dir die Tatsache zunutze, dass ein Unix-Timestamp einfach fortlaufend die Sekunden zählt. Also brauchst du nur zum ursprünglich ermittelten Timestamp 7*86400 zu addieren:

    $date  = strtotime($array['NummerDatum']) + 7*86400;
    $datum = date("d.m.Y", $date);
    

    Was du machst, ist übrigens auch von einem anderen Standpunkt betrachtet ungünstig: Du weist derselben Variablen nach und nach nicht nur verschiedene, sondern sogar verschiedenartige Werte zu. Das ist in Sprachen wie PHP, die keine festen Typen kennen, nicht verboten - aber es ist schwierig, dann den Überblick zu behalten.

    $date  = $array['NummerDatum'];           // das ist reines Umkopieren: Sinnlos
                                              // $date ist nun ein String
    $date  = strtotime($date);                // hier könntest du direkt $array['NummerDatum'] lesen
                                              // $date ist nun ein Timestamp (also int)
    $date  = strtotime("+7 day", $date);      // $date ist immer noch int, aber ein neuer Wert
    $datum = date("d.m.Y", $date);
    

    So long,
     Martin

    1. Hallo,

      Dann mach dir die Tatsache zunutze, dass ein Unix-Timestamp einfach fortlaufend die Sekunden zählt. Also brauchst du nur zum ursprünglich ermittelten Timestamp 7*86400 zu addieren:

      $date  = strtotime($array['NummerDatum']) + 7*86400;
      $datum = date("d.m.Y", $date);
      

      ist das immer richtig? Auch mit Schalttagen und Schaltsekunden?

      Was du machst, ist übrigens auch von einem anderen Standpunkt betrachtet ungünstig: Du weist derselben Variablen nach und nach nicht nur verschiedene, sondern sogar verschiedenartige Werte zu. Das ist in Sprachen wie PHP, die keine festen Typen kennen, nicht verboten - aber es ist schwierig, dann den Überblick zu behalten.

      Da gebe ich dir völlig recht.

      Die Frage was einfacher als "+7 day" (ich hätte eher "+7 days" geschrieben) ist, lässt sich mit "+1 week" beantworten.

      Gruß
      Kalk

      1. Hi,

        Dann mach dir die Tatsache zunutze, dass ein Unix-Timestamp einfach fortlaufend die Sekunden zählt. Also brauchst du nur zum ursprünglich ermittelten Timestamp 7*86400 zu addieren:

        $date  = strtotime($array['NummerDatum']) + 7*86400;
        $datum = date("d.m.Y", $date);
        

        ist das immer richtig? Auch mit Schalttagen und Schaltsekunden?

        Schalttage (also 29. Februar) machen da nichts aus, denn sie sind ja immer reguläre 24-Stunden-Tage. Schaltsekunden dürften auch harmlos sein, denn sie werden AFAIK dadurch ausgeglichen, dass in der Zeit kurz davor die Sekunden etwas gedehnt werden, also das Intervall 24h plus eine Schaltsekunde dennoch genau 86400 Unix-Sekunden lang ist.

        Sollte ich mich in dem Punkt irren, ist der berechnete Zeitpunkt eben um eine Sekunde daneben. Das dürfte aber in einer Anwendung, wo man nur "eine Woche später" haben will, auch nicht ins Gewicht fallen.

        Die Umstellung zwischen Sommer- Winterzeit (sollte sie einmal in das Intervall fallen) ist auch egal, weil der Unix-Timestamp zeitzonenneutral mit UTC arbeitet.

        Die Frage was einfacher als "+7 day" (ich hätte eher "+7 days" geschrieben) ist, lässt sich mit "+1 week" beantworten.

        Stimmt. ;-)
        Und dann fragt man sich mal wieder, warum manche Leute gern "Heute in 8 Tagen" sagen, wenn sie eigentlich 7 Tage, also eine Woche meinen. Bei "Heute in 14 Tagen" ist mir so ein Widerspruch noch nicht aufgefallen.

        Gruß
        Kalk

        So long,
         Martin

        1. Tach,

          Und dann fragt man sich mal wieder, warum manche Leute gern "Heute in 8 Tagen" sagen, wenn sie eigentlich 7 Tage, also eine Woche meinen.

          das haben wir vermutlich aus dem lateinischen übernommen, die haben den heutigen Tag mitgezählt.

          Bei "Heute in 14 Tagen" ist mir so ein Widerspruch noch nicht aufgefallen.

          Im französischen sagt man wohl en quinze jours, „in 15 Tagen“ für in zwei Wochen.

          mfg
          Woodfighter

        2. Tach!

          Die Umstellung zwischen Sommer- Winterzeit (sollte sie einmal in das Intervall fallen) ist auch egal, weil der Unix-Timestamp zeitzonenneutral mit UTC arbeitet.

          Ja, aber der OP verwendet date() und nicht gmdate(), so dass spätestens dann sich die eine Stunde Unterschied bemerkbar macht. Jedenfalls zum Umstellsonntag im Oktober, dann ist der Tag 25 Stunden lang und bei nur 24 addierten Stunden bleibt das Datum auf demselben Tag stehen.

          dedlfix.

    2. @@Der Martin

      geht die Rechnung auch einfacher?

      Dann mach dir die Tatsache zunutze, dass ein Unix-Timestamp einfach fortlaufend die Sekunden zählt. Also brauchst du nur zum ursprünglich ermittelten Timestamp 7*86400 zu addieren:

      $date = strtotime($array['NummerDatum']) + 7*86400;

      Nein, das ist nicht einfacher.

      Für den Computer mag das vielleicht einfacher sein, das ist hier aber völlig irrelevant. (Wir befinden uns nicht in einer zeitkritischen Schleife, wo solche Mikrooptimierung sinnvoll sein könnte.)

      Für Menschen ist '+ 7*86400' unleserlicher Code; es bedarf eines Kommentars, um nachvollziehen zu können, was da passiert.

      '+ 7 days' bzw. '+ 1 week' hingegen ist lesbar; dem sollte der Vorzug gegeben werden.

      LLAP 🖖

      --
      “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
      Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
      1. Moin,

        $date = strtotime($array['NummerDatum']) + 7*86400;

        Nein, das ist nicht einfacher.

        eine Anweisung anstatt derer drei oder vier (egal ob sequentiell oder verschachtelt) ist IMO einfacher; die Elimination mehrerer Funktionsaufrufe zugunsten einer einfachen Grundrechenoperation auch. Finde ich.

        Für den Computer mag das vielleicht einfacher sein, das ist hier aber völlig irrelevant.

        D'accord.

        Für Menschen ist '+ 7*86400' unleserlicher Code; es bedarf eines Kommentars, um nachvollziehen zu können, was da passiert.

        Warum? Dass 86400 Sekunden ein Tag sind, setze ich als bekannt voraus - ebenso wie das Wissen, dass ein Zoll ungefähr 25 Millimetern entspricht (nur so als Beispiel). Das ist IMO Allgemeinwissen. Offensichtliches bedarf nicht unbedingt noch eines Kommentars.

        '+ 7 days' bzw. '+ 1 week' hingegen ist lesbar; dem sollte der Vorzug gegeben werden.

        In der Schreibweise an sich sehe ich weder einen Vorteil, noch einen Nachteil. Einen Nachteil sehe ich aber darin, dass man einmal mehr aufpassen muss, wo man mit Strings und wo mit Zahlen umgeht.

        So long,
         Martin

        1. @@Der Martin

          Für Menschen ist '+ 7*86400' unleserlicher Code; es bedarf eines Kommentars, um nachvollziehen zu können, was da passiert.

          Warum? Dass 86400 Sekunden ein Tag sind, setze ich als bekannt voraus

          Wenn ich dich nachts um drei wecke und frage „Was sagt dir die Zahl 86400?“ antwortest du ohne eine Sekunde nachzudenken „Anzahl der Sekunden eines Tages“?

          Und selbst wenn du diesen Test bestehen solltest, andere werden das nicht. Nicht einmal tagsüber.

          Das ist IMO Allgemeinwissen.

          Nein. Nicht einmal andersrum („Wieviele Sekunden hat ein Tag?“). Die Allgemeinheit wird noch auf 24 × 60 × 60 kommen und dann zu rechnen anfangen.

          LLAP 🖖

          --
          “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
          Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
          1. Hallo,

            Warum? Dass 86400 Sekunden ein Tag sind, setze ich als bekannt voraus

            Wenn ich dich nachts um drei wecke ...

            ... dann würde ich dir im Affekt eine scheuern. ;-)

            und frage „Was sagt dir die Zahl 86400?“ antwortest du ohne eine Sekunde nachzudenken „Anzahl der Sekunden eines Tages“?

            Ja, klar. Okay, ein paar Sekunden Denk- oder Reaktionszeit brauche ich um die Zeit nachts schon, um überhaupt zu verstehen, was da jemand an mich ranlabert.

            Und selbst wenn du diesen Test bestehen solltest, andere werden das nicht. Nicht einmal tagsüber.

            Du hältst es nicht für normal, dass man bestimmte charakteristische Zahlen im Kopf hat? Sekunden pro Tag, Erdradius, Jahr der französischen Revolution, Pi auf zwei bis drei Nachkommastellen, Anzahl der Bundesländer Deutschlands?

            Das ist IMO Allgemeinwissen.

            So long,
             Martin

            1. @@Der Martin

              Wenn ich dich nachts um drei wecke ...

              ... dann würde ich dir im Affekt eine scheuern. ;-)

              Meine Abwehr wäre drauf vorbereitet. ;-)

              Du hältst es nicht für normal, dass man bestimmte charakteristische Zahlen im Kopf hat?

              Bestimmte, ja.

              Sekunden pro Tag,

              Nein.

              Erdradius,

              Nein. Ich hab ungefähr 6000 km im Kopf. 6200? 6300?

              Aber das würde ich nicht bei der Allgemeinheit erwarten.

              (Die Allgemeinheit weiß sicher auch nicht, dass ein Meter seinen Ursprung als 40000. Teil des Erdumfangs hat. Über die Pole, glaube ich.)

              Jahr der französischen Revolution, Pi auf zwei bis drei Nachkommastellen, Anzahl der Bundesländer Deutschlands?

              Hab ich alles im Kopf. Würde da aber auch Lücken bei der Allgemeinheit vermuten.

              LLAP 🖖

              --
              “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
              Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
              1. Hallo,

                Wenn ich dich nachts um drei wecke ...

                ... dann würde ich dir im Affekt eine scheuern. ;-)

                Meine Abwehr wäre drauf vorbereitet. ;-)

                dann is' ja gut.

                Du hältst es nicht für normal, dass man bestimmte charakteristische Zahlen im Kopf hat?

                Bestimmte, ja.

                Sekunden pro Tag,

                Nein.

                Okay, vielleicht für die Allgemeinheit; technik-affine Menschen werden mit dieser Zahl aber oft konfrontiert. Irgendwann kann man sie gar nicht mehr vergessen.

                Erdradius,

                Nein. Ich hab ungefähr 6000 km im Kopf. 6200? 6300?

                Ich habe 6370km als "typischen" Wert im Gedächtnis. Am Äquator ein bisschen mehr, in Polen ... äh, an den Polen bekanntlich etwas weniger.

                (Die Allgemeinheit weiß sicher auch nicht, dass ein Meter seinen Ursprung als 40000. Teil des Erdumfangs hat. Über die Pole, glaube ich.)

                Da fehlen noch drei Zehnerpotenzen. Aber war es nicht ursprünglich der Äquatorumfang? Ah, nein, doch die Polroute, aber nur ein Viertel davon.

                Jahr der französischen Revolution, Pi auf zwei bis drei Nachkommastellen, Anzahl der Bundesländer Deutschlands?

                Hab ich alles im Kopf. Würde da aber auch Lücken bei der Allgemeinheit vermuten.

                Sind aber alles Dinge, die man üblicherweise in der Schule lernt und demnach wissen "sollte". Das ist ein Teil dessen, was ich als Allgemeinwissen betrachte. Zugegeben, ich habe auch nicht mehr den vollen Umfang meines Schulstoffs im Kopf - vor allem nicht Dinge, die mich nie interessiert haben oder die ich jahrzehntelang nicht mehr gebraucht habe. Aber einen großen Teil eben doch, und das ist es, was ich bei anderen eigentlich auch erwarte. Auch wenn diese Erwartung gelegentlich enttäuscht wird.

                So long,
                 Martin

                1. @@Der Martin

                  Sekunden pro Tag,

                  Okay, vielleicht für die Allgemeinheit; technik-affine Menschen werden mit dieser Zahl aber oft konfrontiert. Irgendwann kann man sie gar nicht mehr vergessen.

                  Ich wüsste nicht, warum ich mir die Zahl überhaupt erst merken sollte.

                  Ich hätte 80000 im Kopf, aber nicht den genauen Wert. Wozu auch?

                  Da fehlen noch drei Zehnerpotenzen.

                  Oder ein Kilo.

                  LLAP 🖖

                  --
                  “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
                  Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
        2. Hallo Martin,

          Warum? Dass 86400 Sekunden ein Tag sind, setze ich als bekannt voraus - ebenso wie das Wissen, dass ein Zoll ungefähr 25 Millimetern entspricht (nur so als Beispiel). Das ist IMO Allgemeinwissen.

          Nein, das ist es definitiv nicht. Mir persönlich würde nie im Leben einfallen, dass damit ein Tag gemeint ist. Ich würde es aus dem 7 * schliessen, aber nicht aus der Zahl wissen. Das gleiche gilt für Zoll.

          Offensichtliches bedarf nicht unbedingt noch eines Kommentars.

          Dann ist ja gut, dass wir uns einig sind, dass das nicht offensichtlich ist ;-)

          LG,
          CK

          1. Hi,

            Offensichtliches bedarf nicht unbedingt noch eines Kommentars.

            Dann ist ja gut, dass wir uns einig sind, dass das nicht offensichtlich ist ;-)

            sind wir nicht. Es gibt Dinge (auch Zahlen), die man einfach weiß bzw. wissen sollte; es gibt noch viel mehr Zahlen, die man vielleicht nicht auswendig weiß, aber mit einem stillen "ach ja, genau!" sofort wieder zuordnen kann, wenn man sie irgendwo geschrieben sieht.

            Ciao,
             Martin

            1. Hallo Martin,

              Offensichtliches bedarf nicht unbedingt noch eines Kommentars.

              Dann ist ja gut, dass wir uns einig sind, dass das nicht offensichtlich ist ;-)

              sind wir nicht.

              Ach! ;-)

              Es gibt Dinge (auch Zahlen), die man einfach weiß bzw. wissen sollte;

              Was man wissen sollte sei jetzt mal dahin gestellt, darüber haben viele Leute viele unterschiedliche Meinungen.

              Dass man[tm] deine „Kennzahlen“ weiß halte ich allerdings bestenfalls für naiv und deckt sich überhaupt kein bisschen mit meiner Erfahrung.

              es gibt noch viel mehr Zahlen, die man vielleicht nicht auswendig weiß, aber mit einem stillen "ach ja, genau!" sofort wieder zuordnen kann, wenn man sie irgendwo geschrieben sieht.

              Du schließt von dir auf andere. Gefährlich als Technik-Mensch.

              LG,
              CK

  2. Sowas einfaches?

    <?php
    $daysToAdd   = 7;
    $monthsToAdd = 0;
    $yearsToAdd  = 0;
    list($Y, $m, $d) = explode('-', '2016-03-27');
    echo date( 'Y-m-d', mktime(0,0,0, $m+$monthsToAdd, $d+$daysToAdd, $Y+$yearsToAdd) );
    echo "\n";
    
    2016-04-03
    

    Rückwärts:

    <?php
    $daysToAdd   = -7;
    $monthsToAdd = 0;
    $yearsToAdd  = 0;
    list($Y, $m, $d) = explode('-', '2016-04-03');
    echo date( 'Y-m-d', mktime(0,0,0, $m+$monthsToAdd, $d+$daysToAdd, $Y+$yearsToAdd) );
    echo "\n";
    
    2016-03-27
    
  3. Hallo André,

    Im Feld $array['NummerDatum']; steht z.B. dieser Wert 2016-04-01

    Wo kommt dieser Wert her? Kommt der aus einer Datenbank? Evtl. wäre es einfacher die gleich das Datum ausrechnen zu lassen …

    Gruß,
    Tobias

  4. Tach!

    geht die Rechnung auch einfacher?

    Die Rechung nicht, man kann aber die vier Zeilen zu einer zusammenfassen.

    $date  = $array['NummerDatum'];
    $date  = strtotime($date);
    $date  = strtotime("+7 day", $date);
    $datum = date("d.m.Y", $date);
    
    $datum = date('d.m.Y', strtotime($array['NummerDatum'] . ' + 1 week'));
    

    dedlfix.

  5. Moin!

    Hallo,

    geht die Rechnung auch einfacher?

    $date  = $array['NummerDatum'];
    $date  = strtotime($date);
    $date  = strtotime("+7 day", $date);
    $datum = date("d.m.Y", $date);
    

    Im Feld $array['NummerDatum']; steht z.B. dieser Wert 2016-04-01

    Bin ja echt enttäuscht, dass niemand bisher das wirklich sehr gute DateTime-Objekt in seinen Verbesserungsvorschlägen berücksichtigt hat. DateTime ist in der PHP-Welt tatsächlich das ideale Value-Objekt für Zeitangaben, es gibt sozusagen nichts besseres.

    Dementsprechend kann man, wenn es auf die Zeilenmenge ankommt, sowas bauen:

    $aDate = "2016-03-27";
    
    $weekLater = DateTime::createFromFormat('Y-m-d', $aDate)->add(new DateInterval('P1W'))->format('d.m.Y');
    
    var_dump($weekLater);
    

    Wenn tatsächlich nur ein Zeitstring in dem einen Format eine Woche später berechnet und in einem anderen Format ausgegeben werden soll, dann kommt man allerdings nicht um die drei notwendigen Operationen herum: 1. String in Zeit parsen, 2. eine Woche addieren, 3. Zeit wieder als String ausgeben.

    Der Vorteil mit DateTime zahlt sich dann aus, wenn diese drei Schritte nicht an einer einzigen Stelle passieren, und wenn es konfigurierbar sein muss. Am schönsten noch mit Zeitzonen. Denn anstatt als Parameter einen String zu akzeptieren, den eine Funktion dann selbst parsen muss, ist ein Typehint auf DateTimeInterface (weil es neben DateTime auch DateTimeImmutable gibt) deutlich descriptiver.

    Grüße Sven