Doppelten Uhrzeiten das richtige Datum zuweisen

  • Moin,


    vorab: Ja ich weiß, dass es hier um JavaScript geht und es eigentlich ins andere Unterforum gehört, doch mir geht es nicht um die Sprache, sondern nur um's Konzept. Hilfestellungen in Python, C oder sogar Brainfuck sind gerne gesehen, die Umsetzung in JS wird der einfachere Teil sein.


    Ich ziehe mir Wasserstände von einer Website, doch diese gibt mir nur die Uhrzeit und den Wasserstand zurück, jedoch nicht das Datum. Das Problem ist nun, dass der Zeitraum über 24h läuft und es ohne Datumsangabe zu doppelten Uhrzeiten kommt.


    Beispiel des aktuellen Arrays: [["23:13", 361], ["23:47", 369], ["23:58", 379], ["00:03", 385], ["00:18", 391], ["01:36", 396], ..., ["00:31", 396]]

    (Die Anzahl der Elemente und Uhrzeiten sind immer unterschiedlich/unregelmäßig. Immerhin die Reihenfolge stimmt :angel:)


    Nun brauche ich eine zuverlässige und elegantere Lösung, die mir zu jeder Uhrzeit das richtige Datum liefert, damit der endgültige Zeitstempel so vorliegt: "10.01.2019 17:14"



    Mein erster Ansatz:

    • Halte die Differenz der unterschiedlichen Tage in einer Variable fest
    • Vergleiche immer zwei Uhrzeiten: Wenn i-1 > i (beginnend mit Index 1), dann ist es bereits der nächste Tag (Heute+1). Bsp: 23:58 > 00:03 ==> 00:03 ist bereits der nächste Tag ==> Variable TagesDifferenz += 1
    • Füge das heutige Datum + TagesDifferenz einer Uhrzeit zu. Bsp: (11.01.2019 + 1) 00:03, weil diese Uhrzeit ja schon der nächste Tag ist
    • Ich habe noch eine Art Sicherheit eingebaut, doch ich weiß gerade nicht mehr für welchen Fall das gedacht war :S. Wenn die Minute des ersten Datensatzes > aktuelle Minute, dann TagesDifferenz -= 1. Ist wahrscheinlich für den Fall um die 0 Uhr herum...
      Mir ist es wieder eingefallen. Bsp.: Es ist 00:05 Uhr; die ersten beiden Datensätze sind 23:50 und 00:10. Weil nun 23:50 > 00:10 ist, muss man für 00:10 einen Tag vom heutigen Tag drauflegen. Doch, es ist ja schon 00:05 und das ist derselbe Tag wie 00:10.
      Deshalb vergleiche ich beim ersten Datensatz die Minute. 50 ist größer 10, deshalb ziehe ich einen Tag Differenz ab, der beim Vergleich 23:50 > 00:10 wieder dazuaddiert wird ==> -1 + 1 = 0 ==> 00:10 ist heute, weil es aktuell 00:05 Uhr ist.


    Das funktioniert soweit ganz gut, doch was ist nun bei einem Monatswechsel? 31.01 + 1 sollte nicht in 32.01 resultieren, bei einem Jahreswechsel das gleiche Spiel.



    Danke

    Kelvin

    Kelvin

    Einmal editiert, zuletzt von Kelvin ()

  • Die Date-Instanzen sind in UTC, allerdings werden Stunde und Minute ja ersetzt, also passt es. Wird es direkt in der Konsole ausgegeben, kann es sein, dass der Browser/die JS Engine vor der Darstellung eine Stunde abzieht, wegen dem Zeitunterschied. ersetzt man Zeile 16 durch

    JavaScript
    1. newData.push([date.toLocaleString('de-DE'), value]);

    sieht man, dass es funktioniert:

    Code
    1. [
    2. ["11.1.2019, 23:13:00",361],
    3. ["11.1.2019, 23:47:00",369],
    4. ["11.1.2019, 23:58:00",379],
    5. ["12.1.2019, 00:03:00",385],
    6. ["12.1.2019, 00:18:00",391],
    7. ["12.1.2019, 01:36:00",396],
    8. ["12.1.2019, 00:31:00",396],
    9. ["12.1.2019, 23:59:00",100]
    10. ]
  • sieht man, dass es funktioniert

    Geil, habe nicht so schnell mit so einer ausführlichen Antwort gerechnet ^^


    Allerdings sind die letzten beiden Zeitstempel falsch

    Code
    1. [
    2. ["11.1.2019, 23:13:00",361],
    3. ["11.1.2019, 23:47:00",369],
    4. ["11.1.2019, 23:58:00",379],
    5. ["12.1.2019, 00:03:00",385], // neuer Tag, 12.1
    6. ["12.1.2019, 00:18:00",391],
    7. ["12.1.2019, 01:36:00",396],
    8. ["12.1.2019, 00:31:00",396], // neuer Tag, 13.1
    9. ["12.1.2019, 23:59:00",100]
    10. ]


    Deine Funktion läuft aber schon besser als meine :lol:

    Code
    1. [
    2. ["11.1.2019 23:13", 361]
    3. ["10.1.2019 23:47", 369]
    4. ["10.1.2019 23:58", 379]
    5. ["11.1.2019 00:03", 385]
    6. ["11.1.2019 00:18", 391]
    7. ["11.1.2019 01:36", 396]
    8. ["12.1.2019 00:31", 396]
    9. ["12.1.2019 23:59", 100]
    10. ]

    Kelvin

  • Bei Js-Fragen helfe ich jedem gerne, der es nicht für das Schlimmste hält, was dem Internet je widerfahren ist ;)


    Ich habe vorhin nachträglich noch einen Bug gefixt (hoffentlich), du kannst es ja nochmal probieren - vielleicht hast du aber auch schon den aktuellen Code getestet.


    Ich bin gerade unterwegs und schau es mir heute Abend nochmal in Ruhe an. War vorhin schon zwischen Tür und Angel... :daumendreh2:


    Edit: der Zeitraum ist dann aber doch größer als als die genannten 24h, oder?

    Edit 2: ^ klar. ("über 24h", macht Sinn)

  • Das Datum gibt man in "Datenbanken" (ja, auch eine Text-Datei ist eine Datenbank) entweder mit der DB-Eigenen Funktion an, als Unix-Epoch-Zeit oder 'Rückwärts'


    Und zwar YYYYmmdd, für Heute also 20190111, denn nur so kann man sauber und einfach nach Größe sortieren.


    Die Formatierung des Datums macht man dann bei der Ausgabe.

    Selber denken,
    wie kann man nur?

  • Hallo Rasp-Berlin und RTFM - habt ihr den Beitrag #1 überhaupt gelesen? Der TO bekommt die Daten nicht aus einer Datenbank, sondern wohl genau so von einer Website:

    Zitat

    Ich ziehe mir Wasserstände von einer Website, doch diese gibt mir nur die Uhrzeit und den Wasserstand zurück, jedoch nicht das Datum.

    Da hilft "man date" IMHO nicht wirklich.

  • Hi Kelvin ,


    jetzt aber.



    Mal interessehalber: NodeJS oder im Browser?

  • Das Umschreiben war noch der einfache Teil und funktioniert trotz der stümperhaften Umsetzung :angel:

    JavaScript
    1. const [hours, minutes] = time.split(':').map(x => parseInt(x));

    wurde zu

    JavaScript
    1. var hours = parseInt(time.split(':')[0]); 
    2. var minutes = parseInt(time.split(':')[1]);

    und im Browser funktionierte alles perfekt. Google Sheets hatte jedoch teilweise "NaN.NaN.NaN NaN:NaN" als Zeitstempel eingetragen... nach langem herumspielen, testen und debuggen stellte sich dann heraus, dass Googles Server parseInt() wohl etwas anders handhaben und dadurch ein paar Daten invalidiert wurden. Und ich war scheinbar nicht der erste, der dieses Problem hatte: https://stackoverflow.com/a/17204291/2153629 :lol:

    Kelvin