Beispiel: aktuelles Datum formatieren und ausgeben

Antworten
Benutzeravatar
ruhr70
guru
Beiträge: 2209
Registriert: 24.02.2015, 19:40

Beispiel: aktuelles Datum formatieren und ausgeben

Beitrag von ruhr70 » 01.05.2015, 09:29

Anbei ein Beispiel für eine node-red function, die das aktuelle Datum in ein beliebiges Format umwandelt.
2015-05-01 tst umwandeln.jpg
Code in der Funktion:
Spoiler: Show hidden text

Code: Alles auswählen

// (1) wandelt timestamo ins ISO Datumformat um
//msg.timestamp= new Date().toISOString()

// (2) beliebiges Datum festlegbar: hier: YYYY-MM-DD HH:MM.SS
//     (Ausgabeformat wird danz am Ende zusammengestellt)
var now     = new Date(); 
var year    = now.getFullYear();
var month   = now.getMonth()+1; 
var day     = now.getDate();
var hour    = now.getHours();
var minute  = now.getMinutes();
var second  = now.getSeconds(); 
if(month.toString().length == 1) {
var month = '0'+month;
}
if(day.toString().length == 1) {
var day = '0'+day;
}   
if(hour.toString().length == 1) {
var hour = '0'+hour;
}
if(minute.toString().length == 1) {
var minute = '0'+minute;
}
if(second.toString().length == 1) {
var second = '0'+second;
} 


// Variante1: wenn z.B. nicht ein vorhandener Payload
// überschrieben werden soll, sondern um ein
// Datum ergänzt werden soll.  

//msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;

// Variante 2: Function gibt die aktuelle Zeit als payload aus
msg.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;

return msg;
Node-red Flow:
Spoiler: Show hidden text

Code: Alles auswählen

[{"id":"63c5d5c5.9c3a2c","type":"function","name":"now aktuelles Datum","func":"// (1) wandelt timestamo ins ISO Datumformat um\n//msg.timestamp= new Date().toISOString()\n\n\n// (2) beliebiges Datum festlegbar: hier: YYYY-MM-DD HH:MM.SS\n//     (Ausgabeformat wird danz am Ende zusammengestellt)\nvar now     = new Date(); \nvar year    = now.getFullYear();\nvar month   = now.getMonth()+1; \nvar day     = now.getDate();\nvar hour    = now.getHours();\nvar minute  = now.getMinutes();\nvar second  = now.getSeconds(); \nif(month.toString().length == 1) {\nvar month = '0'+month;\n}\nif(day.toString().length == 1) {\nvar day = '0'+day;\n}   \nif(hour.toString().length == 1) {\nvar hour = '0'+hour;\n}\nif(minute.toString().length == 1) {\nvar minute = '0'+minute;\n}\nif(second.toString().length == 1) {\nvar second = '0'+second;\n} \n  \n//msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\nmsg.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\n\n\nreturn msg;","outputs":1,"x":996.2500152587891,"y":485.00000762939453,"z":"9d9dc866.626238","wires":[["d5e189e4.2a1e78","40557647.bfaa88"]]},{"id":"d5e189e4.2a1e78","type":"ioBroker out","name":"","topic":"TestDatum2","ack":"true","autoCreate":"true","x":1214.166660308838,"y":484.58338928222656,"z":"9d9dc866.626238","wires":[]},{"id":"8820471a.77dfb8","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":801.2500228881836,"y":484.16673278808594,"z":"9d9dc866.626238","wires":[["63c5d5c5.9c3a2c"]]},{"id":"40557647.bfaa88","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1216.250015258789,"y":440.00000762939453,"z":"9d9dc866.626238","wires":[]}]
In dem Beispiel wird nicht das Datum der Nachricht umgewandelt, sondern vom der aktuellen Zeit (Date()).



Test und Beispiel zum Verständnis:
2015-05-01 tst umwandeln 2.jpg
Node-red Flow:
Spoiler: Show hidden text

Code: Alles auswählen

[{"id":"76a3a5f9.895c5c","type":"function","name":"now aktuelles Datum","func":"// (1) wandelt timestamo ins ISO Datumformat um\n//msg.timestamp= new Date().toISOString()\n\n\n// (2) beliebiges Datum festlegbar: hier: YYYY-MM-DD HH:MM.SS\n//     (Ausgabeformat wird danz am Ende zusammengestellt)\nvar now     = new Date(); \nvar year    = now.getFullYear();\nvar month   = now.getMonth()+1; \nvar day     = now.getDate();\nvar hour    = now.getHours();\nvar minute  = now.getMinutes();\nvar second  = now.getSeconds(); \nif(month.toString().length == 1) {\nvar month = '0'+month;\n}\nif(day.toString().length == 1) {\nvar day = '0'+day;\n}   \nif(hour.toString().length == 1) {\nvar hour = '0'+hour;\n}\nif(minute.toString().length == 1) {\nvar minute = '0'+minute;\n}\nif(second.toString().length == 1) {\nvar second = '0'+second;\n} \n\n\n// Variante1: wenn z.B. nicht ein vorhandener Payload\n// überschrieben werden soll, sondern um ein\n// Datum ergänzt werden soll.  \n\n//msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\n\n// Variante 2: Function gobt die aktuelle Zeit als payload aus\nmsg.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\n\nreturn msg;","outputs":1,"x":1112.500015258789,"y":136.66663551330566,"z":"9d9dc866.626238","wires":[["9686a94e.697958","7237ae9e.8dc85","c557ecb1.3aa81"]]},{"id":"9686a94e.697958","type":"ioBroker out","name":"","topic":"TestDatum","ack":"true","autoCreate":"true","x":1311.6666450500488,"y":135.00000190734863,"z":"9d9dc866.626238","wires":[]},{"id":"7237ae9e.8dc85","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1315.833396911621,"y":98.33335304260254,"z":"9d9dc866.626238","wires":[]},{"id":"470bde4f.b8f42","type":"inject","name":"","topic":"Beispiel Datumsformat","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":638.7500076293945,"y":138.33336067199707,"z":"9d9dc866.626238","wires":[["2a14ac81.d5eb54","c9fa1333.3605f"]]},{"id":"2a14ac81.d5eb54","type":"debug","name":"","active":true,"console":"false","complete":"false","x":838.7500114440918,"y":91.2500057220459,"z":"9d9dc866.626238","wires":[]},{"id":"c557ecb1.3aa81","type":"template","name":"Beispiel Object","field":"payload","template":"Topic: {{topic}} -\nTimestamp aus dem inject Node: \n{{tst}} -\nUmwandlung aus der function \"now...\":\n{{payload}}","x":1103.750015258789,"y":228.75000381469727,"z":"9d9dc866.626238","wires":[["5bb61570.a449ec"]]},{"id":"c9fa1333.3605f","type":"function","name":"Test msg.payload = msg.tst","func":"msg.tst = msg.payload;\nreturn msg;","outputs":1,"x":882.5000152587891,"y":136.25000190734863,"z":"9d9dc866.626238","wires":[["76a3a5f9.895c5c"]]},{"id":"5bb61570.a449ec","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1332.5000190734863,"y":227.50000381469727,"z":"9d9dc866.626238","wires":[]}]
Der Lerneffekt für mich war dabei, wie man mehrere Informationen in einer Message (msg) (=Object?) weitergibt und einzeln verarbeitet/ergänzen/ausgeben kann.
Die msg, die zuletzt am template ankommt (template verwende ich z.B. in anderen Flows, um eine Email zusammenzubauen), enthält die Informationen msg.topic (aus dem inject node), msg.tst (Ursprung als msg.payload aus dem inject node, Umwandlung in der folgenden Funktion in msg.tst) und msg.payload aus der Funktion, die das aktuelle Datum (Date()) in ein lesbares Datumsformat umwandelt.



Statt die aktuelle Zeit in der Funktion zu erzeugen soll nun die Zeit aus der msg (im Beispiel msg.payload aus dem inject node) in ein lesbares Datum umgewandelt werden:
2015-05-01 tst umwandeln 3.jpg
Hierzu muss der Code in der Funktion um eine Zeile ergänzt werden.
Nachdem die Variable now mit dem aktuellen Datum erzeugt wurde, wird diese neu gestellt und zwar mit dem msg.payload aus dem inject node.

var now = new Date();
now.setTime(msg.payload); // Zeit aus dem Payload

Das ganze Script aus der Funktion, um diese Zeile ergänzt:
Spoiler: Show hidden text

Code: Alles auswählen

// (1) wandelt timestamo ins ISO Datumformat um
//msg.timestamp= new Date().toISOString()


// (2) beliebiges Datum festlegbar: hier: YYYY-MM-DD HH:MM.SS
//     (Ausgabeformat wird danz am Ende zusammengestellt)


var now     = new Date(); 
now.setTime(msg.payload); // Zeit aus dem Payload
var year    = now.getFullYear();
var month   = now.getMonth()+1; 
var day     = now.getDate();
var hour    = now.getHours();
var minute  = now.getMinutes();
var second  = now.getSeconds(); 
if(month.toString().length == 1) {
var month = '0'+month;
}
if(day.toString().length == 1) {
var day = '0'+day;
}   
if(hour.toString().length == 1) {
var hour = '0'+hour;
}
if(minute.toString().length == 1) {
var minute = '0'+minute;
}
if(second.toString().length == 1) {
var second = '0'+second;
} 
  
//msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;
msg.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;

return msg;


Eine Bitte. Sollte ich etwas falsch verstanden habe, bin ich um jeden Hinweis und jede Korrektur dankbar!
Intel NUC (NUC6i5SYH) -> ESXi 6 > VM Ubuntu 16.04 ioBroker (redis) > VM Ubuntu 16.04 mySQL
Slave: Pi 3 ohne SD (Boot USB SLC)
CCU2, hue 2, DS 1512+, WeMos, Harmony Hub, Alexa
Adapter: Fritzbox / Skripte: dynamic hue, Bluetooth Scanner, WIFFI-wz

Benutzeravatar
Bluefox
Site Admin
Beiträge: 7849
Registriert: 13.07.2014, 14:42
Kontaktdaten:

Re: Beispiel: aktuelles Datum formatieren und ausgeben

Beitrag von Bluefox » 01.05.2015, 09:35

Nur zur Info. ;)

Code: Alles auswählen

var now     = new Date(); 
now.setTime(msg.payload); // Zeit aus dem Payload
Kann man direkt aufrufen:

Code: Alles auswählen

var now     = new Date(msg.payload); // Zeit aus dem Payload

Benutzeravatar
ruhr70
guru
Beiträge: 2209
Registriert: 24.02.2015, 19:40

Re: Beispiel: aktuelles Datum formatieren und ausgeben

Beitrag von ruhr70 » 01.05.2015, 09:57

Klasse!! Danke Dir Bluefox!
Das sind genau die kleinen Infos, die ich brauche um weiterzukommen.
Ist auch irgendwie logisch ;-)


Also

Code: Alles auswählen

var Zeit = new Date();
Erzeugt eine Variable "Zeit" mit der aktuellen Zeit.

Code: Alles auswählen

var Zeit = new Date(msg.payload);
Erzeugt eine Variable "Zeit" anhand des Timestamp aus msg.payload (Unix Format: 1430470225849).

Die Variable "Zeit" hat dann das Format: "2015-05-01T08:51:49.984Z" (nach ISO).

Das Script oben im Threat zerlegt dann dieses Format in seine Einzelteile, um es dann beliebig zusammenbauen zu können.
Intel NUC (NUC6i5SYH) -> ESXi 6 > VM Ubuntu 16.04 ioBroker (redis) > VM Ubuntu 16.04 mySQL
Slave: Pi 3 ohne SD (Boot USB SLC)
CCU2, hue 2, DS 1512+, WeMos, Harmony Hub, Alexa
Adapter: Fritzbox / Skripte: dynamic hue, Bluetooth Scanner, WIFFI-wz

abuzze
starter
Beiträge: 48
Registriert: 06.01.2017, 23:37

Re: Beispiel: aktuelles Datum formatieren und ausgeben

Beitrag von abuzze » 21.03.2018, 06:21

Hallo
Ich habe eine Frage zum Datum und speichern von Dateien.
Wie kann ich eine Datei aus einem http request (buffer )mit einem Zeitstempel versehen ?
/pfad/aktuelles_Datum.jpg
Das ganze soll später für Zeitraffer sein.

Grüsse von der Spree

rewenode
starter
Beiträge: 18
Registriert: 02.11.2017, 02:36

Re: Beispiel: aktuelles Datum formatieren und ausgeben

Beitrag von rewenode » 21.03.2018, 09:58

Wenn man spezielle Datumsformatierungen häufig brauch, kann es sich lohnen, mit er externen moment-lib zu arbeiten.
https://t3n.de/news/momentjs-zeitberech ... t-562592/
Die muss erstmal installiert sein:

$ npm install moment

und in den settings.js im functionGlobalContext hinterlegt sein.

Code: Alles auswählen

    functionGlobalContext: {
        //os:require('os'),
        //fs:require('fs'),
        moment:require('moment')
    },
Dann kann sie im Functionsnode einfach verwendet werden.

Code: Alles auswählen

[{"id":"7a90b82b.fd85","type":"comment","z":"ac1c61ca.ff0038","name":"use moment module in function nodes","info":"https://momentjs.com/docs/\n","x":276,"y":105,"wires":[]},{"id":"f29493e0.f060f","type":"inject","z":"ac1c61ca.ff0038","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":209,"y":156,"wires":[["c0891056.eb7c"]]},{"id":"c0891056.eb7c","type":"function","z":"ac1c61ca.ff0038","name":"ext. Lib moment","func":"let moment = global.get('moment');\n\nmsg.date = moment().format(\"DD.MM.YYYY hh:mm\");     //moment example\n\nreturn msg","outputs":1,"noerr":0,"x":400,"y":156,"wires":[["bd9aef67.7569d8"]]},{"id":"bd9aef67.7569d8","type":"debug","z":"ac1c61ca.ff0038","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":574,"y":156,"wires":[]}]

abuzze
starter
Beiträge: 48
Registriert: 06.01.2017, 23:37

Re: Beispiel: aktuelles Datum formatieren und ausgeben

Beitrag von abuzze » 21.03.2018, 12:55

Hallo
Ich kann das erst heute Abend mal testen.
Eins verstehe ich noch nicht. —-.......und in den settings.js im functionGlobalContext hinterlegt sein——
Wo befindet sich denn die settings.js ? Vielleicht geht es ja auch einfacher. Es soll ja nur ein Bild gespeichert werden mit aktuellem Datum.
Danke

rewenode
starter
Beiträge: 18
Registriert: 02.11.2017, 02:36

Re: Beispiel: aktuelles Datum formatieren und ausgeben

Beitrag von rewenode » 21.03.2018, 17:31

Vielleicht geht es ja auch einfacher. Es soll ja nur ein Bild gespeichert werden mit aktuellem Datum.
Dann solltest du vlt.

Code: Alles auswählen

let suffix = ".jpg" //what ever
let date = new Date();
let file = date.getTime()+suffix;

oder ähnlich nehmen .

Dann sind diene Dateien auch gleich nach Datum sortiert.

abuzze
starter
Beiträge: 48
Registriert: 06.01.2017, 23:37

Re: Beispiel: aktuelles Datum formatieren und ausgeben

Beitrag von abuzze » 21.03.2018, 21:23

Danke erstmal.Aber ich komme nicht weiter ,weil ich nicht weis was ich damit anfangen soll.Ich dachte das ich einfach ein functions node hinter meinem http request node habe und dann is alles gut ,aber es scheint doch etwas komplizierter zu sein.
Hast du vielleicht ein Beispiel wo ich mich orientieren kann ? Das wäre schön.
Danke

abuzze
starter
Beiträge: 48
Registriert: 06.01.2017, 23:37

Re: Beispiel: aktuelles Datum formatieren und ausgeben

Beitrag von abuzze » 21.03.2018, 21:57

Ok. Ich glaube ich habe es selber herausgefunden.

Code: Alles auswählen

msg.filename = "/root/timelapse/pic"+msg.payload+".jpg";
return msg;

Danke
Dateianhänge
Bildschirmfoto 2018-03-21 um 21.55.03.png
Bildschirmfoto 2018-03-21 um 21.55.03.png (29.05 KiB) 443 mal betrachtet

Antworten