Hannes Weninger: JavaScript Check time

Hallo,

ich habe eine Funktion, die mit checken soll, ob eine Zeit folgendes Format hat:

02:00 01:30 00:30

Meine Funtion functioniert mit allen Zeiten über einer Stunde, 00:30 funktioniert zum Beispiel nicht. Meine Frage wäre jetzt, wie ich den regex ausdruck ändern muss, damit das auch geht.

Meine Funktion

Danke Hannes

  1. Hallo,

    Meine Funktion

    wenn ich das korrekt lese, hat das nix mit dem Regex zu tun, sondern einfach damit, dass die Stundenzahl größer als null sein soll.

    Gruß
    Kalk

  2. Tach!

    ich habe eine Funktion, die mit checken soll, ob eine Zeit folgendes Format hat:

    02:00 01:30 00:30

    Meine Funtion functioniert mit allen Zeiten über einer Stunde, 00:30 funktioniert zum Beispiel nicht.

    if (hours > 0 && hours < 24 && minutes >= 0 && minutes < 60) {
        $scope.validState = true;
        return true;
    }
    $scope.validState = false;
    return false;
    

    Wenn 0 ein gültiger Wert für Stunde ist, dann darf die Prüfung nicht 0 ausschließen, sondern muss wie bei den Minuten >= lauten.

    Außerdem machst du es umständlicher als notwendig. Zum einen sollte die Funktion keine Werte außerhalb ändern, sondern nur ein Ergebnis zurückliefern. Das Konstrukt lässt sich damit eindampfen zu:

    return hours >= 0 && hours < 24 && minutes >= 0 && minutes < 60;
    

    [0-9] kann in einem Regexp auch als \d geschrieben werden (d wie digit). Auch der Regex-Test sollte $scope.validState nicht setzen.

    Damit hast du nun aber ein anderes Problem, das sich wie folgt lösen lässt. Das ng-click ruft nicht isTimeValid() ab, sondern checkTimeValidity(). Und diese neu zu schreibende Funktion befragt ihrerseits isTimeVaid() und setzt dann aus deren Ergebnis die entsprechenen Werte im $scope. Damit kann dann isTimeValid() eine einfache lokale Funktion werden, die nicht an $scope hängen muss (falls es nicht noch andere Gründe gibt).

    dedlfix.

  3. Hi,

    Meine Funktion

    zusätzlich zum bereits gesagten:

    /^(\d{2})\:(\d{2})$/

    Die Klammern brauchst Du auch nicht, denn Du greifst nicht per back-reference darauf zu.

    Und der Doppelpunkt muß auch nicht escaped werden.

    /^\d{2}:\d{2}$/ reicht also aus. Und ist schneller, da die back-references nicht ermittelt werden müssen.

    cu,
    Andreas a/k/a MudGuard