NEWS
Timestamp Umwandeln in Node Red (gelöst)
-
Hi, kann mir vielleicht jemand sagen wie ich einen Timestamp von einer Input Node bzw. Get Node in ein anderes Format (Jahr, Monat, Tag, Stunden, Minuten) umwandeln kann?
-
@frankyboy73 Da gibt es wie immer mehrere Möglichkeiten
Hier mal 2 Varianten:
-
JSONata $now()
Nähere Infos findest du hier:
Beschreibung $now() -
Plain Javascript im function-node
var options = { hour: 'numeric', minute: 'numeric', second: 'numeric' }; global.set("mydTime", function () { return ((new Date()).toLocaleDateString('de-DE', options)) })
Da musst du dich mit dem JD Date Object auseinandersetzen.
Näheres z.B. hier:
Javascript Date()Gruß Reiner
-
-
@rewenode Hi, vielen Dank für deine Antwort. Deine Funktion macht nur leider das genaue Gegenteil von dem was ich gesucht habe. Die wandelt das Datum wieder in Millisekunden um.
Edit: Hatte gedacht ich hätte ne Lösung gefunden und hier auch gepostet, aber da hatte ich mir den Timestamp nur ins aktuelle Datum umgewandelt und nicht den Timestamp selber. Deshalb Post Editiert und wieder entfernt.
-
@frankyboy73 Ich hab ja nicht gesagt, dass ich dein konkretes Problem lösen will. Ich habe dir nur 2 Wege aufgezeigt, wie man das lösen kann.
In meinem Beispiel gebe ich beim Funktion-node einen formatierten Datumsstring unter dem Node aus.
Aber natürlich kannst du den auch im payload haben.Dazu musst du den payload entsprechend füllen.
Wie dein Format konkret zu formatieren ist, kannst du den Links entnehmen.msg.payload = global.get("mydTime")();
-
@rewenode Hi, ok das habe ich wohl falsch verstanden oder überlesen
. Ich dachte die Funktion Node sollte die Funktion haben die ich suchte.
Vielen Dank für die verlinkten Seiten, nach viel lesen und rumprobieren, bin ich jetzt zu einer Lösung gekommen. Ich wandle die Nachricht (msg.payload.ts) ins Date Format um, ziehe mir die einzelnen Daten ( Jahr, Monat, Tage usw.) aus der Nachricht und setzte sie nacher wieder als neue Nachricht mit dem gleichen Namen zusammen.
var dt = new Date(msg.payload.ts); var Monat = dt.getMonth() + 1; var Tag = dt.getDate(); var Jahr = dt.getFullYear(); var Stunde = dt.getHours(); var Minute = dt.getMinutes(); var Sekunde = dt.getSeconds(); if(Monat.toString().length == 1) { var Monat = '0'+Monat; } if(Tag.toString().length == 1) { var Tag = '0'+Tag; } if(Stunde.toString().length == 1) { var Stunde = '0'+Stunde; } if(Minute.toString().length == 1) { var Minute = '0'+Minute; } if(Sekunde.toString().length == 1) { var Sekunde = '0'+Sekunde; } msg.payload.ts = Tag+'-'+Monat+'-'+Jahr+' / '+Stunde+':'+Minute+':'+Sekunde; return msg;
Falls jemand ne einfachere oder bessere Lösung weiß, bin ich für jeden Vorschlag zu haben.
-
@frankyboy73 Sollte mit einem entsprechenden Formatstring zwar einfacher gehen, aber so bist du natürlich voll flexibel und kannst di Ausgabe so machen wie du es brauchst.
-
@rewenode Stimmt, nach dem ich mich jetzt etwas eingelesen habe und mich noch etwas mit deinem Beispiel beschäftigt habe, habe ich es auch kapiert. Je nach dem was ich bei "return" als Konvertierung eingebe (toLocalDateString oder toUTCString, usw) bekomme unterschiedliche Ausgaben des Datums. Meine bevorzugte Variante wäre glaube ich UTCString. Dann muss ich nur noch bei Date auf die richtige msg verweisen und ich habe das was ich wollte.
Vielen Dank für den Schubser in die richtige Richtung, dadurch habe ich wieder ne Menge dazu gelernt. Mehr als hättest du mir die komplette Lösung für meinen Bedarf auf dem Silbertabett serviert.
// diese funktion wandelt msg.payload.ts in Wochentag Tag Monat Jahr Stunde Minute Sekunde um // +3600000 weil sonst eine Stunde zu wenig angezeigt wird global.set("mydTime", function () { return ((new Date(msg.payload.ts + 3600000)).toUTCString()) }) msg.payload.ts = global.get("mydTime")(); return msg;
Edit: Bei UTC oder auch bei GMT wurde mir leider 1 Stunde zu wenig angezeigt. Weiß jemand woran das liegt?
Ich habe mir jetzt erst mal damit beholfen das ich zu meiner msg.payload.ts 3600000 (1 Stunde) dazu addiere. Mal schauen ob das auch beim 0 Uhr (Tageswechsel) so hin haut. -
@frankyboy73 Kann zwar nicht mit Sicherheit sagen, ob das das Problem löst, weil ich damit nicht getestet habe, aber du solltest vlt. hier mal reinschauen:
So fixes ändern +/- 1 Stunde fällt einem i.d.R. irgendwann auf die Füße;-)
-
@rewenode Hi, danke, mit dem getTimezoneOffset klappts jetzt, ohne das ich es fix umrechnen muss.
-
@frankyboy73 Ich nutze die Javascript Moment Bibliothek - da bist am flexibelsten.
Hier mal die Nodes: https://flows.nodered.org/node/node-red-contrib-moment
dann hast Du zur formatierung der Datum/Zeit folgende Möglichkeiten:
https://momentjs.com/docs/#/displaying/format/
Musst halt über den Adapter oder falls Du Palettenmanager nutzt über diesen installieren.
-
@mickym said in Timestamp Umwandeln in Node Red (gelöst):
Musst halt über den Adapter oder falls Du Palettenmanager nutzt über diesen installieren.
Nicht unbedingt nötig. Moment.js ist in allen JSONata-nodes (change, incjekt usw.) seit NR 1.1.0 enthalten.
Siehe hier: moment.js in NR
-
@rewenode said in Timestamp Umwandeln in Node Red (gelöst):
@mickym said in Timestamp Umwandeln in Node Red (gelöst):
Musst halt über den Adapter oder falls Du Palettenmanager nutzt über diesen installieren.
Nicht unbedingt nötig. Moment.js ist in allen JSONata-nodes (change, incjekt usw.) seit NR 1.1.0 enthalten.
Siehe hier: moment.js in NR
Klasse !!! Das wusste ich auch noch nicht. Allerdings hat es mich nun ca. 2 Stunden gekostet - bis ich die Syntax rausbekommen habe, dass ich das gleiche wie mit der Node bekommen habe - aber letztlich habe ich es rausbekommen.
Wichtig scheint hier auch die Reihenfolge zu sein.
Ich hab das mal hier in dem Flow gegenübergestellt:
Hier mal mit der Moment Node:Hier mit der ChangeNode und JSONata:
Um also auch die deutschen Namen zu übernehmen muss das locale vorne dran gestellt werden, das ist leider in der Beschreibung nicht drin gewesen.
Also wie folgt:$moment(payload).locale("de").format('dddd, [der] D. MMMM YYYY [um] HH:mm')
Statt hh wie in dem Screenshot kk oder HH für 24h Anzeige nehmen.
HIer wieder der gesamte Workflow zum Nachvollziehen:
[ { "id": "df944da5.6a23e", "type": "inject", "z": "dce8fa20.2e93c8", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 940, "y": 140, "wires": [ [ "ccf0fb59.dd6798", "39d58864.e30568", "8b85c7e7.4986b8" ] ] }, { "id": "bfb1aa88.fe50c8", "type": "debug", "z": "dce8fa20.2e93c8", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 1390, "y": 140, "wires": [] }, { "id": "ccf0fb59.dd6798", "type": "moment", "z": "dce8fa20.2e93c8", "name": "", "topic": "", "input": "", "inputType": "msg", "inTz": "Europe/Berlin", "adjAmount": 0, "adjType": "days", "adjDir": "add", "format": "dddd, [der] D. MMMM YYYY [um] hh:mm", "locale": "de-DE", "output": "", "outputType": "msg", "outTz": "Europe/Berlin", "x": 1170, "y": 140, "wires": [ [ "bfb1aa88.fe50c8" ] ] }, { "id": "9e57419a.12eb2", "type": "debug", "z": "dce8fa20.2e93c8", "name": "Change Node", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 1400, "y": 180, "wires": [] }, { "id": "39d58864.e30568", "type": "change", "z": "dce8fa20.2e93c8", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "$moment(payload).locale(\"de\").format('dddd, [der] D. MMMM YYYY [um] hh:mm')", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1170, "y": 180, "wires": [ [ "9e57419a.12eb2" ] ] }, { "id": "8b85c7e7.4986b8", "type": "debug", "z": "dce8fa20.2e93c8", "name": "unix TimeStamp", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 1160, "y": 100, "wires": [] } ]
Nochmal ganz herzlichen Dank an Dich @rewenode . Man lernt nicht aus.
Die Zeitzonen habe ich auch gerade getestet das funktioniert auch - allerdings ist es auch wieder wichtig, dass die vor dem Format String steht:
$moment(payload).locale("de").tz('Europe/Berlin').format('dddd, [der] D. MMMM YYYY [um] HH:mm')
Hier habe ich im Übrigen noch ein Auflistung für mögliche Zeitzonen gefunden.
-
-
So sieht die Meldung jetzt in Telegram aus .
-
@frankyboy73 said in Timestamp Umwandeln in Node Red (gelöst):
Na schaut doch gut aus - hast Du Change Node - mit JSONata verwendet?
-
@mickym
Ja, ich habe die change Node verwendet.
Hier der Eintrag.$moment(payload.ts).locale("de").format('dddd, D.MM.YYYY [,] kk[ Uhr ]mm')
-
@mickym said in Timestamp Umwandeln in Node Red (gelöst):
Allerdings hat es mich nun ca. 2 Stunden gekostet - bis ich die Syntax rausbekommen habe, dass ich das gleiche wie mit der Node bekommen habe - aber letztlich habe ich es rausbekommen.
Ja, ist leider nicht gerade einfach dokumentiert.
Hätte vlt. noch diesen Link angeben sollen https://momentjs.com/docs/
Da braucht's aber auch viel Zeit da durchzusteigen;-) Na wenigstens hast du jetzt die wichtigsten Infos zusammengetragen. Danke dafür!