mixmastertobsi: PHP date Tag prüfen

Hallo,

ich versuche mit PHP zu prüfen, ob wir uns gerade in dem Zeitraum X befinden.

$array["Weekend"]["time"]["1"]["start"] = strtotime('Friday 18:00:00');
$array["Weekend"]["time"]["1"]["end"] = strtotime('Sunday 23:59:59');

Wenn wir nun Freitag 19 Uhr haben, gibt mir das Skript true zurück. Alles gut. Nun haben wir aber Samstag und eigentlich befinden wir uns noch in dem Zeitraum, allerdings gibt mit das Skript false zurück und es liegt wohl daran, dass nun als Datum der nächste Freitag genommen wird, da der Freitag gestern bereits verstrichen ist. Nun habe ich Versucht mit Kalenderwoche dem Skript mitzuteilen, dass er das Datum von dem Freitag in der aktuellen Kalenderwoche nehmen muss, aber leider gelingt mir das nicht...

$array["Weekend"]["time"]["1"]["start"] = strtotime('Friday 2016W13 18:00:00');
$array["Weekend"]["time"]["1"]["end"] = strtotime('Sunday 2016W13 23:59:59');
  1. Hallo,

    Nun haben wir aber Samstag und eigentlich befinden wir uns noch in dem Zeitraum, allerdings gibt mit das Skript false zurück und es liegt wohl daran, dass nun als Datum der nächste Freitag genommen wird, da der Freitag gestern bereits verstrichen ist.

    reichts vielleicht, zu prüfen, ob Samstag/Sonntag und falls Freitag, ob nach 18 Uhr?

    Gruß
    Kalk

  2. Hallo,

    $array["Weekend"]["time"]["1"]["start"] = strtotime('Friday 2016W13 18:00:00');
    

    Entweder du prüfst (wie von Tabellenkalk geschrieben) auf Sa/So/Fr>18:00 Uhr oder du schreibst hinter Friday statt der Kalenderwoche einfach noch "this week".

    Gruß,
    Tobias

    1. Hallo und Danke, doch leider geht es nicht

      $array["Weekend"]["time"]["1"]["start"] = strtotime('Friday this week 18:00:00');
      
      date("Y-m-d",strtotime('Friday this week 18:00:00'));
      # = 2016-04-08
      
      date("Y-m-d",strtotime('Friday 2016W13 18:00:00'));
      # = 2016-03-28 
      
      1. Hallo,

        date("Y-m-d",strtotime('Friday 2016W13 18:00:00')); = 2016-03-28

        wie man im Vergleich mit einem Kalender sieht, ist das kein Freitag, sondern ein Montag.

        Probiere mal:

        date("Y-m-d",strtotime('2016W13 +4 days 18:00:00'));
        

        Gruß
        Kalk

      2. Hallo und Danke, doch leider geht es nicht

        Wenn die Dokumentation zu den relativen Datumsformaten nicht verständlich oder ungenügend ist, dann mach es einfach und stupid:

        <?php
        /* Unit-Test
        $LE="<br>\n";
        $zeitpunkt[] = date('U');
        $zeitpunkt[] = date('U', mktime(16, 30, 0, 1, 7, 2000));
        $zeitpunkt[] = date('U', mktime(16, 31, 0, 1, 7, 2000));
        $zeitpunkt[] = date('U', mktime(17, 0, 0, 1, 8, 2000));
        $zeitpunkt[] = date('U', mktime(17, 0, 0, 1, 9, 2000));
        $zeitpunkt[] = date('U', mktime(22, 30, 0, 1, 9, 2000));
        $zeitpunkt[] = date('U', mktime(22, 31, 0, 1, 9, 2000));
        
        foreach ($zeitpunkt as $zp) {
            if ( ifWeekend($zp) ) {
                echo date('Y m d H:i :: N G ::  D, H:i', $zp) . " : Positiv$LE";
            } else {
                echo date('Y m d H:i :: N G ::  D, H:i', $zp) . " : Negativ$LE";
            }
        }
        //*/
        
        function ifWeekend
            (
                $timestamp,
                $firstWeekendDay    = 5,  //Freitag
                $firstWeekendHour   = 16,
                $firstWeekendMinute = 31,
                $lastWeekendDay     = 7,  //Sonntag
                $LastWeekendHour    = 22,
                $LastWeekendMinute  = 30
            ) {
        
            $weekDay    = date('N', $timestamp);
            $hour       = date('G', $timestamp);
            $minute     = date('i', $timestamp);
        
            if (
                    (
                            $weekDay == $firstWeekendDay
                        and $hour    >  $firstWeekendHour
                    )
        
                or  (
                            $weekDay == $firstWeekendDay
                        and $hour    == $firstWeekendHour
                        and $minute  >= $firstWeekendMinute
                    )
        
                or  (
                            $weekDay >  $firstWeekendDay
                        and $weekDay <  $lastWeekendDay
                    )
        
                or  (
                            $weekDay == $lastWeekendDay
                        and $hour    <  $LastWeekendHour
                    )
        
                or  (
                            $weekDay == $lastWeekendDay
                        and $hour    == $LastWeekendHour
                        and $minute  <= $LastWeekendMinute
                    )
        
            )   {
                return true;
            } else {
                return false;
            }
        }
        

        Wenn Deine Definition von "Wochenende" aber auch wahlweise den "Montag 6:00" Uhr als Ende vorsehen sollte oder können soll, dann brauchst Du ein wenig wenig mehr if(and or)-then-else.

        1. Hallo Regina Schlauklug,

          mach es einfach und stupid:

          Ja, das hatte ich im ersten Thread auch schon mal vorgeschlagen.

          Bis demnächst
          Matthias

          --
          Wenn eine Idee nicht zuerst absurd erscheint, taugt sie nichts. (Albert Einstein)
      3. Hallo,

        Hallo und Danke, doch leider geht es nicht

        $array["Weekend"]["time"]["1"]["start"] = strtotime('Friday this week 18:00:00');
        
        date("Y-m-d",strtotime('Friday this week 18:00:00'));
        # = 2016-04-08
        

        Dann ist das Handbuch zu strtotime() falsch oder ich versteh das Changelog zu Version 5.3 falsch - so wie ich das interpretiere müsste mit "this week" eigentlich die aktuelle Woche von Montag bis Sonntag gemeint sein, tatsächlich ist es aber die Woche von Sonntag bis Samstag. Vielleicht solltest du wirklich die Variante verwenden die Tabellenkalk vorgeschlagen hat und einfach prüfen ob das aktuelle Datum ein Samstag/Sonntag oder ein Freitag nach 18 Uhr ist.

        Gruß,
        Tobias

        1. Tach,

          Dann ist das Handbuch zu strtotime() falsch oder ich versteh das Changelog zu Version 5.3 falsch - so wie ich das interpretiere müsste mit "this week" eigentlich die aktuelle Woche von Montag bis Sonntag gemeint sein, tatsächlich ist es aber die Woche von Sonntag bis Samstag.

          der Sonntag als erster Tag der Woche ist in den USA üblich und in date geht die Woche auch von Sonntag 0 bis Samstag 6, wenn man nicht explizit die ISO-Woche verlangt.

          mfg
          Woodfighter

          1. Hallo woodfighter,

            der Sonntag als erster Tag der Woche ist in den USA üblich und in date geht die Woche auch von Sonntag 0 bis Samstag 6, wenn man nicht explizit die ISO-Woche verlangt.

            Weiß ich :-) Aber im Handbuch steht halt zu strtotime():

            Prior to PHP 5.3.0, relative time formats supplied to the time argument of strtotime() such as this week, previous week, last week, and next week were interpreted to mean a 7 day period relative to the current date/time, rather than a week period of Monday through Sunday.

            weswegen bin ich davon ausgegangen dass der Sonntag der letzte Tag der Woche und nicht der erste.

            Gruß,
            Tobias

            1. Tach,

              Weiß ich :-) Aber im Handbuch steht halt zu strtotime():

              Prior to PHP 5.3.0, relative time formats supplied to the time argument of strtotime() such as this week, previous week, last week, and next week were interpreted to mean a 7 day period relative to the current date/time, rather than a week period of Monday through Sunday. weswegen bin ich davon ausgegangen dass der Sonntag der letzte Tag der Woche und nicht der erste.

              hmm, warum habe ich den Satz nicht gefunden, als ich ihn gestern gesucht habe? Da hätte ich doch eigentlich schon wach sein sollen.

              mfg
              Woodfighter