mixmastertobsi: PHP Date Prüfen

Hallo,

ich möchte mit einen Variablen Datum rechnen. Das heißt, ich habe einen Gutscheincode, der von Montag-Donnerstag von 18 - 24 Uhr gültig ist, oder von Freitag 18 Uhr bis Sonntag 24 Uhr. Nun soll das Skript prüfen, ob wir uns an dem Wochentag befinden und in der Zeit zwischen 18 - 24 Uhr, oder eben am Freitag nach 18 Uhr und Sonntag 24 Uhr. Wie ist das möglich?

Ich habe es mit strtotime("Tuesday 18:00:00")); probiert, allerdings kann ich damit ja immer nur einen Wochentag abfragen. Und wenn ich zum Beispiel Dienstag komplett weglasse, würde es am Wochenende nicht passen.

  1. Hallo mixmastertobsi,

    Ich habe es mit strtotime("Tuesday 18:00:00")); probiert, allerdings kann ich damit ja immer nur einen Wochentag abfragen.

    Holzhammer: OR existiert.

    Bis demnächst
    Matthias

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

      OR würde sicher funktionieren, aber nicht wenn ich die Daten in der Datenbank als Gutscheincode hinterlegen möchte.

      $date = date("Y-m-d",strtotime("2016-W13 Monday 00:00:00")); echo $date;

      Habe mal folgendes probiert, aber warum kommt hier als Ausgabe der 31.3.2016?

      1. Hallo mixmastertobsi,

        OR würde sicher funktionieren, aber nicht wenn ich die Daten in der Datenbank als Gutscheincode hinterlegen möchte.

        Lege die Datenbank-Struktur für deinen Gutschein so an, dass du danach selektieren kannst:

        CREATE TABLE vouchers (
          id INTEGER AUTOINCREMENT PRIMARY KEY,
          code VARCHAR(100) UNIQUE NOT NULL
        );
        CREATE TABLE valid_voucher_days (
          id INTEGER AUTOINCREMENT PRIMARY KEY,
          voucher_id INT NOT NULL REFERENCES vouchers(id),
          day_of_week INT NOT NULL,
          start_time TIME NOT NULL,
          end_time TIME NOT NULL
        );
        

        Dann kannst du jetzt alle gültigen Gutscheine abfragen:

        SELECT code
          FROM vouchers v
          INNER JOIN valid_voucher_days d
            ON d.voucher_id = v.id AND d.day_of_week = :wochentag AND start_time <= :zeit AND end_time >= :zeit;
        

        Die Bedeutung der Platzhalter sollte klar sein.

        LG,
        CK

  2. Lieber mixmastertobsi,

    Ich habe es mit strtotime("Tuesday 18:00:00")); probiert,

    das ist vernünftig. Damit bekommst Du einen Zahlenwert (Anzahl Sekunden seit 1.1.1970), den Du vergleichen kannst.

    allerdings kann ich damit ja immer nur einen Wochentag abfragen.

    Nein, einen Zeitpunkt. Du willst ein Zeitfenster prüfen:

    $time_window = array(
        'start' => strtotime('Tuesday 18:00:00'),
        'end' => strtotime('Tuesday 23:59:59')
    );
    
    $now = time();
    
    if ($now >= $time_window['start']
        && // AND-Operator
        $now <= $time_window['end']
    ) {
        // OK!
    } else {
        // verfallen
    }
    

    Wenn Du eine Liste (Array) an Zeitfenstern prüfen möchtest, dann macht man das so:

    $time_windows = array(
        array(
            'start' => strtotime('Tuesday 18:00:00'),
            'end' => strtotime('Tuesday 23:59:59')
        ),
        array(
            'start' => strtotime('Friday 18:00:00'),
            'end' => strtotime('Sunday 23:59:59')
        )
    );
    
    $now = time();
    
    // Wir gehen davon aus, dass alles passt.
    $ok = true; // Eine solche Variable nennt man "Flag".
    
    foreach ($time_windows as $window) {
    
        if ($now < $window ['start']
            || // OR-Operator
            $now > $window['end']
        ) {
            $ok = false; // Oops, passt wohl doch nicht.
        }
    }
    
    // Flag prüfen
    if ($ok) {
        // OK!
    } else {
        // verfallen
    }
    
    

    Liebe Grüße,

    Felix Riesterer.

  3. Hi,

    ich möchte mit einen Variablen Datum rechnen.

    ... das in welcher Form vorliegt? Im besten Fall als Unix-Timestamp. Wenn nicht, bekommt man einen solchen relativ leicht.

    Das heißt, ich habe einen Gutscheincode, der von Montag-Donnerstag von 18 - 24 Uhr gültig ist, oder von Freitag 18 Uhr bis Sonntag 24 Uhr.
    Nun soll das Skript prüfen, ob wir uns an dem Wochentag befinden und in der Zeit zwischen 18 - 24 Uhr, oder eben am Freitag nach 18 Uhr und Sonntag 24 Uhr. Wie ist das möglich?

    Du hast mehrere Intervalle, die sich nach Wochentag und Uhrzeit definieren. Wochentag und Uhrzeit kannst du aus einem Timestamp bekommen. Dann brauchst du nur noch eine Reihe von verknüpften Abfragen:

    (Montag UND (Zeit zwischen 18 und 24))
    ODER
    (Dienstag UND (Zeit zwischen 18 und 24))
    ODER
    (Donnerwoch UND (Zeit zwischen 18 und 24))
    ...

    Das Intervall Freitag 18 Uhr bis Sonntag 24 Uhr kannst du splitten und dann Freitag 18 bis 24 Uhr abfragen, oder Samstag oder Sonntag ohne Berücksichtigung der Zeit.

    Schön ist das natürlich nicht; sollten sich die Intervalle mal ändern, musst du jedesmal den Code der Abfrage ändern. Eleganter wäre eine Art Tabelle, in der die Intervalle definiert werden. Aber das heben wir uns für die zweite Folge auf. ;-)

    Ich habe es mit strtotime("Tuesday 18:00:00")); probiert, allerdings kann ich damit ja immer nur einen Wochentag abfragen. Und wenn ich zum Beispiel Dienstag komplett weglasse, würde es am Wochenende nicht passen.

    Den Gedankengang verstehe ich nicht.

    So long,
     Martin

    1. Hallo,

      (Montag UND (Zeit zwischen 18 und 24))
      ODER
      (Dienstag UND (Zeit zwischen 18 und 24))
      ODER
      (Donnerwoch UND (Zeit zwischen 18 und 24))
      ...

      Kann man dann nicht auch die ersten beiden Abfragen auf Mondienstag vereinen?

      Gruß
      Kalk

      1. Hi,

        (Donnerwoch UND (Zeit zwischen 18 und 24))

        Kann man dann nicht auch die ersten beiden Abfragen auf Mondienstag vereinen?

        na gut, einigen wir uns auf Mienstag.

        Ich hatte beim Schreiben noch kurz mein Humormodul gecheckt, weil ich nicht wusste, ob Donnerwoch oder Dönerstag dran war. Einer von beiden jedenfalls. ;-)

        Ciao,
         Martin