NEWS
Anzahl der Tage nach Datum
-
-
@mickym
Ah, okay. Das Problem tritt aber nur auf, wenn man kein Enddatum angibt. Gruß Tom -
Ah, okay. Das Problem tritt aber nur auf, wenn man kein Enddatum angibt. Gruß Tom
Nein hat damit nichts zu tun - wie gesagt, dass Problem ist immer, dass Date Objekt in JS mit Index 0 rechnen.
Wie gesagt ich hab unten ja zur Javascript Referenz verlinkt. https://www.w3schools.com/js/js_dates.aspDas hat mit dem Enddatum nichts zu tun, da musst du genauso eins abziehen.
Folglich gibt dies hier:
var Duration = require("duration"); var duration = new Duration(new Date(2022,6,1),new Date(2022,7,1)); return duration.days;
31 Tage und nicht 30, weil es sich hier nicht um den JUNI, sondern um den JULI handelt.
Dies hingegen berechnet korrekt den JUNI:
var Duration = require("duration"); var duration = new Duration(new Date(2022,5,1),new Date(2022,6,1)); return duration.days;
Also 30 Tage.
BEACHTE: Bei dieser Schreibweise, werden 3 Argumente als Zahlen zur Konstruktion des Date-Objektes übergeben und KEIN String (oder Array, das implizit in einen String umgewandelt wird). Insofern war das Problem von @metaxa nicht nur, dass er einen Monat zuviel genommen hat, sondern 2 unterschiedliche Formate zur Konstruktion des Date-Objektes.
-
-
@tt-tom Nein es ist nicht falsch beschrieben. Das Date-Objekt wurde dort halt ebenfalls mit 3 Zahlenargumenten konstruiert. Die Duration Bibliothek vergleicht ja nur 2 Date-Objekte. Wie die Date-Objekte erstellt werden, sind Javascriptmethoden und haben mit der Duration Bibliothek überhaupt nichts zu tun. In dieser von mir verlinkten Seite siehst Du ja mit welch verschiedenen Methoden man ein Date-Objekt erstellen kann.
Somit ist klar, dass zum Beispiel das heutige Datum mit einem Date-Objekt wie folgt generiert werden kann:
new Date() new Date(year, month, day, hours, minutes, seconds, milliseconds) new Date(milliseconds) new Date(date string)
also entspricht eben (mal Uhrzeit ignorierend)
var datum = []; datum[0] = new Date(); datum[1] = new Date(2022,6,17); datum[2] = new Date("2022,7,17"); return datum;
ergibt dann:
['2022-07-17T13:35:04.179Z','2022-07-16T22:00:00.000Z','2022-07-16T22:00:00.000Z']
Man sieht dann allerdings, dass sich ohne Zeitangaben immer UTC Zeiten ergeben, also GMT +0. Das ist halt immer der Bezugspunkt. Für die Duration ist das aber egal, weil ja dann auch Start- und Endzeiten immer UTC Zeiten, als Basis dienen. Bei Zeitdifferenzen ist das auch egal, da man ja nicht mit absoluten sondern nur relative Zeiträume hat.
-
-
Ja das ist soweit alles klar. Aber wie du auch schon hingewiesen hast
Folglich gibt dies hier:
var Duration = require("duration"); var duration = new Duration(new Date(2022,6,1),new Date(2022,7,1)); return duration.days;
31 Tage und nicht 30, weil es sich hier nicht um den JUNI, sondern um den JULI handelt.
Wenn ich die Bibliothek nutze muss ich wissen, das Date den Monat mit 0 beginnt. da hätte ich mir einen Hinweis gewünscht, darum dachte ich es ist falsch beschrieben.
Gruß Tom
-
Ich darf vielleicht kurz erklären was ich bezwecke. "RoI" ich möchte einfach den jeweils aktuellen Zeitpunkt errechnen, ab dem sich meine PV-Investition gerechnet hat. Ja klar, ohne Zinsen & Zinseszinsen & Inflation, einfach als Richtwert.
Mein nächstes Hindernis wird bei der PoI Datumsberechnung die Addition von x Tagen zum heutigen Datum sein. Geht das auch mit dieser Bibliothek? Ich fürchte nicht.
-
-
@tt-tom Danke!
Die manuelle Form habe ich schon gefunden und testweise umgesetzt. Hoffte jetzt, dass es mit einer "gschmeidigen" JS Bibliothek oder Function geht. -
@metaxa ja die gibt es. Musst nur die moment Library nutzen. Hier mal die komplette Dokumentation:
https://momentjs.com/docs/#/manipulating/Wenn Du moment nutzt, dann kannst auf duratlion verzichten, da du Differenz 2er moments berechnen lassen kannst.
-
@mickym sagte in Anzahl der Tage nach Datum:
Hier mal die komplette Dokumentation
Du hast dich nicht zufällig vertippt und meinst "komplexe" Dokumentation? Ganz lieben Dank, ich werde mich einlesen und ggf. erlauben hier nachzufragen.
-
@metaxa Also ich bin bekannterweise kein Blockly Fan (auch wenn es manchen schon nervt das zu hören) - aber die moment Bibliothek ist sehr mächtig - (da brauchst dann auch die duration Bibliothek nur noch in Sonderfällen). Ich arbeite ja mit NodeRed und da ist die Bibliothek Bestandteil der JSONATA Syntax. Falls Du die Möglichkeit in der Praxis mit NodeRed sehen möchtest auch im Vergleich zu Blockly - siehst Du hier: https://forum.iobroker.net/topic/50086/datum-und-zeitverarbeitung-mit-nodered
So nun aber mal kurz ein paar Beispiele wie Du die moments Bibliothek ohne durations, aber mit der moment Bibliothek nutzen kannst. Ein Vorteil ist, dass Du Datum auch als deutsches Stringformat eingeben kannst.
Hier mal die Berechnung von Zeitdifferenzen in Tagen:
Einmal ohne Angabe eines Enddatums (dann heute):
Mit Moment schaut die Funktion dann so aus:
var moment = require( "moment"); var anfang = new moment(Anfang,"DD.MM.YYYY"); var ende = Ende ? moment(Ende,"DD.MM.YYYY") : new moment(); return ende.diff(anfang,'days');
Nun zum Addieren von Tagen mit der Moments Bibliothek - ich zeige hier nur wie Du die Doku dann für Blockly umsetzen kannst.
Gibt man kein Datum mit, werden Anzahl Tage (hier 5) zum heutigen Datum dazugezählt: Also 5 Tage zu heute (17.7.2022) ist der 22.7.2022.
Achte bitte darauf dass ich bei der Eingabe der Datumsformate das Monatsdatum immer 2-stellig definiert habe.
Wenn man ein spezielles Datum definiert dann zum Besipiel 5 Tage zum 30.7.2022 ergibt den 4.8.2022-
var moment = require( "moment"); var datum = Datum ? new moment(Datum,"DD.MM.YYYY") : new moment(); datum = datum.add(Tage,'days'); return datum.format('DD.MM.YYYY');
Also mit der Bibliothek ziemlich easy.
Und nun solltest Du mit der Dokumentation klar kommen.
Hier mal das gesamte Blockly zum Import:
-
@mickym sagte in Anzahl der Tage nach Datum:
siehst Du hier:
Da tut sich ein völlig neue Welt für mich auf, boahhhhh.
@mickym sagte in Anzahl der Tage nach Datum:
Hier mal das gesamte Blockly zum Import:
Bin ich froh, noch 2 Tage Urlaub zu haben.
Herzlichsten Dank für die wahnsinnige Detailarbeit!
Chapeau! -
jetzt musste ich mich ein wenig überwinden um blockly mal zu verwenden.
aber das müsste jetzt das Ergebnis sein.
In den Instanz-Einstellungen des javascript-Adapters muss moment als zusätzliches NPM-Modul notiert sein. -
Bei mir werden die "Tageseit" nicht mehr aktualisiert. Habe vor zwei Tagen ein komplettes Update meiner iobroker Kiste gemacht. Habe jetzt Javascript ist nun Version 6, duration ist aktuell.
Hat jemand vielleicht eine Idee, woran das liegen könnte, das log spuckt nichts in der Richtung aus.VG
srkonus -
@srkonus said in Anzahl der Tage nach Datum:
Bei mir werden die "Tageseit" nicht mehr aktualisiert. Habe vor zwei Tagen ein komplettes Update meiner iobroker Kiste gemacht. Habe jetzt Javascript ist nun Version 6, duration ist aktuell.
Hat jemand vielleicht eine Idee, woran das liegen könnte, das log spuckt nichts in der Richtung aus.VG
srkonusScheint sich erledigt zu haben