Rotkaeppchen: Problem mit Weiterleitung innerhalb eines bestimmten Zeitraums

Hi,

habe folgendes Javascript-Problem und wäre für Hilfe sehr dankbar!

Nachdem ich einige Bedingungen geprüft habe, möchte ich abschließend noch überprüfen ob der Benutzer innerhalb eines bestimmten Zeitfensters auf die Seite kommt... weil er nur dann auf eine andere Seite weitergeleitet werden soll... Das Problem sieht so aus:

  
else if ((Stunden >= 15) && ((Stunden <= 16) && (Minuten <= 30))) {  
   document.location.href="ueberraschung.html";  
      }  

Der Benutzer soll also nur zwischen 15 Uhr und 16:30 Uhr weitergeleitet werden. Das Problem ist, dass man jetzt ab 15:31 Uhr nicht mehr weitergeleitet wird (Die Minuten-Abfrage bezieht sich also scheinbar bereits auf die 15...)

Hoffe ich konnte den Sachverhalt einigermaßen verständlich rüberbringen...

Grüße und Danke im voraus
Rotkaeppchen

  1. Du willst doch eigentlich eher (Stunden == 15 || (Stunden == 16 && Minuten <= 30)), oder?

    Nebenbei: eine solche Weiterleitung clientseitig zu realisieren, birgt ein maximales Sicherheitsrisiko. Außerdem hast Du es idR. mit lokaler Zeit zu tun, die je nach Zeitzone unterschiedlich sein kann.

    Gruß, LX

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
    1. (Stunden == 15 || (Stunden == 16 && Minuten <= 30)) will ich eigentlich nicht wirklich, da das Zeitfenster ja zwischen 15 Uhr und 16:30 Uhr offen sein soll...

      Oder steh ich jetzt komplett auf dem Schlauch?

      Welches Sicherheitsrisiko meinst du genau? Sorry, aber hab noch nicht sehr viel Erfahrung mit Javascript... Ist es das gleiche Sicherheitsrisiko das alle Javascript-Anwendungen mit sich bringen (also der Grund warum es manche im Browser deaktivieren) oder ein erhöhtes weil die Zeit vom Betriebssystem ausgelesen wird?

      Würde es nämlich gern in JS umsetzen, da ich von PHP und Co sehr sehr wenig Ahnung hab...

      Das mit der lokalen Zeit nehme ich in Kauf, da die Seite deutschsprachig ist und ich somit nicht wirklich von einer großen Zielgruppe im internationalen Raum ausgehe...

      Grüße, Rotkaeppchen

      1. Hi,

        (Stunden == 15 || (Stunden == 16 && Minuten <= 30)) will ich eigentlich nicht wirklich, da das Zeitfenster ja zwischen 15 Uhr und 16:30 Uhr offen sein soll...

        Also (Stunden >= 15) UND (Stunden <= 16 UND Minuten <= 30)

        Welches Sicherheitsrisiko meinst du genau?

        Na ja, wenn ich in den Code schaue, sehe ich ja, wohin "weitergeleitet" werden soll - also kann ich mir die Adresse auch kopieren, und sie um 23:47 Uhr manuell aufrufen.

        oder ein erhöhtes weil die Zeit vom Betriebssystem ausgelesen wird?

        Na ja, das bedeutet nur, dass "zwischen 15 und 16:30 Uhr" fuer jemanden "hier" global ein anderer Zeitraum ist, als fuer jemanden in Chile oder Japan. Lokal natuerlich fuer alle immer Nachmittags.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Genau... (Stunden >= 15) UND (Stunden <= 16 UND Minuten <= 30) hatte ich mir auch schon gedacht nur eben für JS formatiert als (da UND ja so geschrieben nicht zulässig ist, oder?):

            
          else if ((Stunden >= 15) && (Stunden <= 16 && Minuten <= 30)) {  
             document.location.href="ueberraschung.html";  
                }  
          
          

          Das Problem ist eben nur, dass man z.B. um 15:31 nicht weitergeleitet wird. Ich hab wirklich nicht sonderlich viel Erfahrung mit JS, aber es scheint mir so das die Klammern ignoriert werden und sich die Angabe bezüglich der Minuten auch auf die 15 bezieht...

          Das man die Adresse im Quelltext sieht und dann manuell aufrufen kann ist egal, da die Sache mit dem Zeitfenster nur ein kleiner Gag sein soll und nichts von großer Wichtigkeit ist...

          Grüße und danke an alle die sich an der Lösung des Problems beteiligen, Rotkaeppchen

          1. Hi,

            else if ((Stunden >= 15) && (Stunden <= 16 && Minuten <= 30)) {

            es scheint mir so das die Klammern ignoriert werden und sich die Angabe bezüglich der Minuten auch auf die 15 bezieht...

            Ja, stimmt, die Klammerung ist bei mehreren UND-Verknuepften Bedingungen sinnlos; die Bedingung taugt so nichts.

            Wie ermittelst du denn Stunden und Minuten?
            Du koennest das ganze einfach als Dezimalzahl betrachten, 15 und 16.3 - und dann abfragen, ob die aktuelle Uhrzeit dazwischen liegt.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Hi,

              Wie ermittelst du denn Stunden und Minuten?

              Ich lasse die Stunden und Minuten in Variablen schreiben:

                
              var Stunden = Jetzt.getHours();  
              var Minuten = Jetzt.getMinutes();  
              
              

              Du koennest das ganze einfach als Dezimalzahl betrachten, 15 und 16.3 - und dann abfragen, ob die aktuelle Uhrzeit dazwischen liegt.

              Der Denkansatz ist cool... Ich lasse jetzt abfragen ob es schon 16:30 Uhr ist und wenn ja, lasse ich es in die neue Variable Schluss mit dem Wert 16.3 schreiben, was ich dann problemlos zum weiteren abgleichen verwenden kann... hab's eben getestet und funktioniert perfekt...

              Das Problem ist somit gelöst... Danke ChrisB!

              Grüße, Rotkaeppchen

            2. Du koennest das ganze einfach als Dezimalzahl betrachten

              Man könnte ein Datum auch einfach als Datumsobjekt betrachten.

              Mathias

        2. Hi,

          (Stunden == 15 || (Stunden == 16 && Minuten <= 30)) will ich eigentlich nicht wirklich, da das Zeitfenster ja zwischen 15 Uhr und 16:30 Uhr offen sein soll...

          Also (Stunden >= 15) UND (Stunden <= 16 UND Minuten <= 30)

          Ich muß mich bei Dir entschuldigen. Statt Dir eine funktionierende Lösung zu liefern, hätte ich Dich lieber auf Dein eigentliches Problem verweisen sollen: Offenbar hast Du die Bedeutung logischer Verknüpfungen nicht verstanden. Um 15 Uhr 31 wirkt sich Deine Abfrage folgendermaßen aus:

          (Stunden >= 15 [wahr] UND (Stunden <= 16 [wahr] UND Minuten <= 30 [unwahr]) [unwahr] ) [unwahr]

          Falls es zu kompliziert ist: als erstes wird die geklammerte Abfrage ausgewertet. Die Stunde ist kleiner gleich 16, was wahr ergibt, Minuten ist aber größer als 30, was falsch ergibt - daher gibt der geklammerte Ausdruck falsch zurück.

          Bitte ignoriere die von mir oben genannte Lösung und versuche, Dein Problem tatsächlich zu verstehen.

          Gruß, LX

          --
          X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: Unusual
          X-Please-Search-Archive-First: Absolutely Yes
  2. else if ((Stunden >= 15) && ((Stunden <= 16) && (Minuten <= 30))) {
       document.location.href="ueberraschung.html";
          }

      
    Datumsobjekte kann man direkt mit den Operatoren <, >, <=, => usw. vergleichen. Man muss nur entsprechende Datumsobjekte erzeugen, die die Zeitpunkte wiedergeben. Das finde ich viel eleganter und lesbarer als solche Vergleichsketten:  
      
    function todayAtTime (hours, minutes, seconds) {  
     var date = new Date;  
     date.setHours(hours);  
     date.setMinutes(minutes);  
     date.setSeconds(seconds);  
     return date;  
    }  
    var now = new Date,  
     start = todayAtTime(15, 0, 0),  
     end = todayAtTime(16, 30, 0);  
    if (now >= start && now < end) {  
       alert("Es ist zwischen 15:00 Uhr und 16:30 Uhr!");  
    }  
      
    (Wenn ich jetzt richtig gedacht habe...)  
      
    Wenn man das noch weiter abstrahieren will, kann man sich ein Zeitintervall-Objekt basteln, das eine Methode anbietet, die zurückliefert, ob ein Zeitpunkt im Intervall liegt.  
      
    Mathias
    
    -- 
    [JavaScript-Erweiterung für das SELFHTML-Forum](http://forum.de.selfhtml.org/js/doku/)
    
    1. function todayAtTime (hours, minutes, seconds) {
      var date = new Date;
      date.setHours(hours);
      date.setMinutes(minutes);
      date.setSeconds(seconds);
      return date;
      }
      var now = new Date,
      start = todayAtTime(15, 0, 0),
      end = todayAtTime(16, 30, 0);
      if (now >= start && now < end) {
         alert("Es ist zwischen 15:00 Uhr und 16:30 Uhr!");
      }

      Hab's eben ausprobiert... funktioniert auch perfekt! Bin jetzt dabei damit zu experimentieren... Danke Mathias!

      Grüße, Rotkaeppchen