Hannes Weninger: javascript Time Überlappungen

Hallo,

ich hätte eine Frage zum Handling von Zeiten in javascript, und zwar hab ich ein Array von Objekten, wo jedes Objekt eine StartZeit und eine Endzeit hat, z.B.


var myObjectArray = [];

var myObject1 = {};
myObject1.startTime = '08:00';
myObject1.endTime = '12:30';
...

var myObject2 = {};
myObject2.startTime = '11:20';
myObject2.endTime = '18:30';
...

myObjectArray.push(myObject1);
myObjectArray.push(myObject2);

Ich bin jetzt gerade am Überlegen, wie ich am besten den check mache, ob sich die Zeiten im Array "myObjectArray" überlappen. Hat vielleicht jemand eine Idee, wie ich das am Besten machen könnte?

Danke! Hannes

  1. Hallo,

    schau dir mal das Date-Objekt an, und da speziell getTime. Wenn du die Zeiten entsprechend umgerechnet hast, geht der Vergleich problemlos mit dem if-Statement.

    Gruß
    Jürgen

    1. Lieber JürgenB,

      schau dir mal das Date-Objekt an

      da wollen wir aber schnell noch eine Funktion hinterher schieben, mit der der OP sein Zeitformat (HH:mm) wieder herstellen kann, sonst nützt ihm der Hinweis vielleicht nicht viel! Dazu benötigt man die Methoden getHours() und getMinutes():

      function date2hhmm (d) {
          var h = d.getHours(),
              m = d.getMinutes();
      
          return (h < 10 ? "0" : "") + h + ":" + (m < 10 ? "0" : "") + m;
      }
      

      Wie schon angedeutet, kann man von zwei Date-Objekten mittels der getTime()-Methode auf die Millisekunde genau sagen, welches einen späteren Zeitpunkt (größerer Zahlenwert der Anzahl Millisekunden) beschreibt. Inwiefern man das Objekt als solches mittels < oder > zuverlässig vergleichen kann, ist mir nicht bekannt.

      Liebe Grüße,

      Felix Riesterer.

  2. Moin,

    var myObjectArray = [];
    
    var myObject1 = {};
    myObject1.startTime = '08:00';
    myObject1.endTime = '12:30';
    ...
    
    var myObject2 = {};
    myObject2.startTime = '11:20';
    myObject2.endTime = '18:30';
    ...
    
    myObjectArray.push(myObject1);
    myObjectArray.push(myObject2);
    

    ich möchte mich zunächst Jürgen anschließen und dir zur Verwendung des Date-Objekts raten. Dann kannst du auch zwei Zeiten vergleichen, ohne auf die genaue Schreibweise (führende Null, Trennzeichen) achten zu müssen, wie es jetzt bei deiner String-Notation der Fall ist.

    Ich bin jetzt gerade am Überlegen, wie ich am besten den check mache, ob sich die Zeiten im Array "myObjectArray" überlappen. Hat vielleicht jemand eine Idee, wie ich das am Besten machen könnte?

    Ich würde das Array zunächst nach den Start-Zeitpunkten der Einträge sortieren, und dann vom ersten bis zum vorletzten(!) Eintrag darüber iterieren. Stellst du irgendwo fest, dass
    Beginn[n+1] < Ende[n]
    ist, dann liegt eine Überlappung der Intervalle vor.

    So long,
     Martin

    1. @@Der Martin

      Ich würde das Array zunächst nach den Start-Zeitpunkten der Einträge sortieren

      Ich nicht. Das dürfte unnötig teuer sein.

      Da man sowieso einmal durch das Array iteriert, bestimmt man dabei das Maximum der startTime-Werte und das Minimum der endTime-Werte. Ist ersteres größer als letzteres, liegt eine Überlappung vor. Dann kann man die Schleife vorzeitig abbrechen.

      LLAP 🖖

      --
      „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
      „Hat auf dem Forum herumgelungert …“
      (Wachen in Asterix 36: Der Papyrus des Cäsar)
      1. Hallo,

        Da man sowieso einmal durch das Array iteriert, bestimmt man dabei das Maximum der startTime-Werte und das Minimum der endTime-Werte. Ist ersteres größer als letzteres, liegt eine Überlappung vor. Dann kann man die Schleife vorzeitig abbrechen.

        ?

        Frühstück von 6 - 9
        Mittag von 11 - 13
        Keine Überlappung

        max_start: 11
        min_end: 9
        max_start > min_end
        doch eine Überlappung?

        Gruß
        Kalk

        1. @@Tabellenkalk

          Frühstück von 6 - 9
          Mittag von 11 - 13
          Keine Überlappung

          max_start: 11
          min_end: 9
          max_start > min_end
          doch eine Überlappung?

          Man sollte zwischen max_end = 23 und min_start = 9 nicht posten.

          LLAP 🖖

          --
          „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
          „Hat auf dem Forum herumgelungert …“
          (Wachen in Asterix 36: Der Papyrus des Cäsar)
          1. Hallo,

            Man sollte zwischen max_end = 23 und min_start = 9 nicht posten.

            Hättest du min_start = 8 geschrieben, hätte ich dir beipflichten können...

            Gruß
            Kalk

            1. Hallo Tabellenkalk,

              Man sollte zwischen max_end = 23 und min_start = 9 nicht posten.

              Hättest du min_start = 8 geschrieben, hätte ich dir beipflichten können...

              Warum stehen die Studenten immer um 9 auf? Damit sie es bis 22 Uhr in den Supermarkt schaffen.

              Bis demnächst
              Matthias

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

    was genau ist Dein Anwendungsfall? Wenn man mehr darüber wüsste, könnte man Dir besser raten.

    Liebe Grüße,

    Felix Riesterer.

    1. was genau ist Dein Anwendungsfall? Wenn man mehr darüber wüsste, könnte man Dir besser raten.

      Ich habe ein oder mehrere Zeiten und der User kann Zeiten hinzufügen. Ich möchte ihm dann den Hinweis geben, wenn sich Zeiten überlappen.