NEWS
[gelöst] JSONata loop - $moment > Invalid date?
-
Hallo zusammen,
ich komme gerade nicht mehr weiter und verstehe auch nicht wo der Fehler liegt.
In der markierten Zeile wird korrekt zum 03.01.2025 mittels
add(1,'days')
ein Tag als Test addiert. Soweit so gut.
In der markierten loop wird das Datum als "Invalid date" ausgegeben.
Debug:
Mein Flow:
Hintergrund des Flows ist, dass ich im Anschluss jedes Datum auf Übereinstimmung zum aktuellen Tag überprüfen möchte.
So habe ich es bei den Feiertagen bereits umgesetzt.{ "Feiertag":"Neujahr", "payload": ( $date := $moment($moment(payload[0].startDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $today := $moment($moment().format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $date.isSame($today) ) }
Danke für eure Unterstützung.
-
Du musst etwas aufpassen mit Deinen Referenzen. $ ändert sich ja - je nach Kontext. Also musst du wenn Du weiter unten auf die payload verweist auf das Root-Nachrichtenobjekt verweisen und auch innerhalb der Schleife hast Du $ ja bereits verwendet - deswegen würde ich den Kontext fix einer Variablen zuweisen. Zumindest scheint es damit zu funktionieren:
[ { "Ferien":"Weihnachtsferien", "start": $moment(payload[0].startDate,'YYYY-MM-DD').format('DD.MM.YYYY'), "end": $moment(payload[0].endDate,'YYYY-MM-DD').add(1,'days').format('DD.MM.YYYY'), "payload": ( $start := $moment($moment(payload[0].startDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $end := $moment($moment(payload[0].endDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $diff := $end.diff($start, 'days'); ([1..$diff])@$d.{ "day": $d, "date": $moment($$.payload[0].startDate,'YYYY-MM-DD').add($d,'days').format('DD.MM.YYYY') } ) } ]
-
Wenn Du alle Ferien aufeinmal haben willst geht es so:
Hier der Import:
payload. { "Ferien": $.name[language="DE"].text, "start": $moment($.startDate,'YYYY-MM-DD').format('DD.MM.YYYY'), "end": $moment($.endDate,'YYYY-MM-DD').add(1,'days').format('DD.MM.YYYY'), "payload": ( $start := $moment($moment($.startDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $end := $moment($moment($.endDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $diff := $end.diff($start, 'days'); ([1..$diff])@$d.{ "day": $d, "date": $moment($.startDate,'YYYY-MM-DD').add($d,'days').format('DD.MM.YYYY') } ) }
Das erzeugt dann diese Ausgabe:
[ { "Ferien": "Weihnachtsferien", "start": "23.12.2024", "end": "04.01.2025", "payload": [ { "day": 1, "date": "24.12.2024" }, { "day": 2, "date": "25.12.2024" }, { "day": 3, "date": "26.12.2024" }, { "day": 4, "date": "27.12.2024" }, { "day": 5, "date": "28.12.2024" }, { "day": 6, "date": "29.12.2024" }, { "day": 7, "date": "30.12.2024" }, { "day": 8, "date": "31.12.2024" }, { "day": 9, "date": "01.01.2025" }, { "day": 10, "date": "02.01.2025" }, { "day": 11, "date": "03.01.2025" } ] }, { "Ferien": "Frühjahrsferien", "start": "03.03.2025", "end": "08.03.2025", "payload": [ { "day": 1, "date": "04.03.2025" }, { "day": 2, "date": "05.03.2025" }, { "day": 3, "date": "06.03.2025" }, { "day": 4, "date": "07.03.2025" } ] }, { "Ferien": "Osterferien", "start": "14.04.2025", "end": "26.04.2025", "payload": [ { "day": 1, "date": "15.04.2025" }, { "day": 2, "date": "16.04.2025" }, { "day": 3, "date": "17.04.2025" }, { "day": 4, "date": "18.04.2025" }, { "day": 5, "date": "19.04.2025" }, { "day": 6, "date": "20.04.2025" }, { "day": 7, "date": "21.04.2025" }, { "day": 8, "date": "22.04.2025" }, { "day": 9, "date": "23.04.2025" }, { "day": 10, "date": "24.04.2025" }, { "day": 11, "date": "25.04.2025" } ] }, { "Ferien": "Pfingstferien", "start": "10.06.2025", "end": "21.06.2025", "payload": [ { "day": 1, "date": "11.06.2025" }, { "day": 2, "date": "12.06.2025" }, { "day": 3, "date": "13.06.2025" }, { "day": 4, "date": "14.06.2025" }, { "day": 5, "date": "15.06.2025" }, { "day": 6, "date": "16.06.2025" }, { "day": 7, "date": "17.06.2025" }, { "day": 8, "date": "18.06.2025" }, { "day": 9, "date": "19.06.2025" }, { "day": 10, "date": "20.06.2025" } ] }, { "Ferien": "Sommerferien", "start": "01.08.2025", "end": "16.09.2025", "payload": [ { "day": 1, "date": "02.08.2025" }, { "day": 2, "date": "03.08.2025" }, { "day": 3, "date": "04.08.2025" }, { "day": 4, "date": "05.08.2025" }, { "day": 5, "date": "06.08.2025" }, { "day": 6, "date": "07.08.2025" }, { "day": 7, "date": "08.08.2025" }, { "day": 8, "date": "09.08.2025" }, { "day": 9, "date": "10.08.2025" }, { "day": 10, "date": "11.08.2025" }, { "day": 11, "date": "12.08.2025" }, { "day": 12, "date": "13.08.2025" }, { "day": 13, "date": "14.08.2025" }, { "day": 14, "date": "15.08.2025" }, { "day": 15, "date": "16.08.2025" }, { "day": 16, "date": "17.08.2025" }, { "day": 17, "date": "18.08.2025" }, { "day": 18, "date": "19.08.2025" }, { "day": 19, "date": "20.08.2025" }, { "day": 20, "date": "21.08.2025" }, { "day": 21, "date": "22.08.2025" }, { "day": 22, "date": "23.08.2025" }, { "day": 23, "date": "24.08.2025" }, { "day": 24, "date": "25.08.2025" }, { "day": 25, "date": "26.08.2025" }, { "day": 26, "date": "27.08.2025" }, { "day": 27, "date": "28.08.2025" }, { "day": 28, "date": "29.08.2025" }, { "day": 29, "date": "30.08.2025" }, { "day": 30, "date": "31.08.2025" }, { "day": 31, "date": "01.09.2025" }, { "day": 32, "date": "02.09.2025" }, { "day": 33, "date": "03.09.2025" }, { "day": 34, "date": "04.09.2025" }, { "day": 35, "date": "05.09.2025" }, { "day": 36, "date": "06.09.2025" }, { "day": 37, "date": "07.09.2025" }, { "day": 38, "date": "08.09.2025" }, { "day": 39, "date": "09.09.2025" }, { "day": 40, "date": "10.09.2025" }, { "day": 41, "date": "11.09.2025" }, { "day": 42, "date": "12.09.2025" }, { "day": 43, "date": "13.09.2025" }, { "day": 44, "date": "14.09.2025" }, { "day": 45, "date": "15.09.2025" } ] }, { "Ferien": "Herbstferien", "start": "03.11.2025", "end": "08.11.2025", "payload": [ { "day": 1, "date": "04.11.2025" }, { "day": 2, "date": "05.11.2025" }, { "day": 3, "date": "06.11.2025" }, { "day": 4, "date": "07.11.2025" } ] }, { "Ferien": "Buß- und Bettag", "start": "19.11.2025", "end": "20.11.2025" }, { "Ferien": "Weihnachtsferien", "start": "22.12.2025", "end": "06.01.2026", "payload": [ { "day": 1, "date": "23.12.2025" }, { "day": 2, "date": "24.12.2025" }, { "day": 3, "date": "25.12.2025" }, { "day": 4, "date": "26.12.2025" }, { "day": 5, "date": "27.12.2025" }, { "day": 6, "date": "28.12.2025" }, { "day": 7, "date": "29.12.2025" }, { "day": 8, "date": "30.12.2025" }, { "day": 9, "date": "31.12.2025" }, { "day": 10, "date": "01.01.2026" }, { "day": 11, "date": "02.01.2026" }, { "day": 12, "date": "03.01.2026" }, { "day": 13, "date": "04.01.2026" }, { "day": 14, "date": "05.01.2026" } ] } ]
-
@mickym said in JSONata loop - $moment > Invalid date?:
Vielen lieben Dank. So funktioniert es.
[ { "Ferien":"Weihnachtsferien", "start": $moment(payload[0].startDate,'YYYY-MM-DD').format('DD.MM.YYYY'), "end": $moment(payload[0].endDate,'YYYY-MM-DD').format('DD.MM.YYYY'), "payload": ( $start := $moment($moment(payload[0].startDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $end := $moment($moment(payload[0].endDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $today := $moment($moment().format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $diff := $end.diff($start, 'days'); ([1..$diff])@$day.{ "date": $moment($$.payload[0].startDate,'YYYY-MM-DD').add($day,'days').format('DD.MM.YYYY'), } ) } ]
Wie könnte man den Vergleich durchführen? Ich bekomme folgende Meldung
"Ungültiger JSONata Ausdruck: Attempted to invoke a non-function"
"isSame": $($$.payload[$day].payload[$day].date).isSame($$today)
Wäre es vielleicht auch möglich ohne
payload[0].payload[0].date
? Daran bin ich bis jetzt noch gescheitert. Dann wäre es vielleicht einfacher mit dem Vergleichen.$date := { ([0..$diff])@$day.{ $moment($$.payload[0].startDate,'YYYY-MM-DD').add($day,'days').format('DD.MM.YYYY'); } };
-
Wäre es vielleicht auch möglich ohne payload[0].payload[0].date? Daran bin ich bis jetzt noch gescheitert. Dann wäre es vielleicht einfacher mit dem Vergleichen.
Ich habe dir doch gerade unten gepostet, wie Du alle Ferien aufeinmal ausgibst
Mit der Abfrage habe ich nun festgestellt, dass es anscheinend nicht geht, wenn man den selbst berechneten Wert als 2. Paramter übergibt.
Ich habs nun aber für alle gemacht und mal schnell die Weihnachtsferien - für eine Woche verlängert, um heute in die Weihnachtsferien zu bekommen.
Diese permanenten Formatwechsel sind eher kontraproduktiv.
Hier mal der Import:
So schaut der Code momentan aus:
payload. { "Ferien": $.name[language="DE"].text, "start": $moment($.startDate,'YYYY-MM-DD').format('DD.MM.YYYY'), "end": $moment($.endDate,'YYYY-MM-DD').add(1,'days').format('DD.MM.YYYY'), "payload": ( $start := $moment($moment($.startDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $end := $moment($moment($.endDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $diff := $end.diff($start, 'days'); ([1..$diff])@$d. { "day": $d, "date": $moment($.startDate,'YYYY-MM-DD').add($d,'days').format('DD.MM.YYYY'), "isSame": $moment($.startDate,'YYYY-MM-DD').add($d,'days').isSame($moment(),'day') } ) }
Was ich festgestellt habe - ist vielleicht ein Bug in der Bibliothek.
das geht:
"isSame": $moment($.startDate,'YYYY-MM-DD').add($d,'days').isSame($moment(),'day')
umgekehrt geht nicht (warum kann ich Dir nicht sagen):
"isSame": $moment().isSame(($moment($.startDate,'YYYY-MM-DD').add($d,'days')),'day')
Hier beides nochmal zum Import:
Ich bin mir allerdings nicht sicher, ob es wirklich die ganzen Ausgaben braucht. Und payload in payload ist bissi verwirrend.
letztlich langt ja die Abfrage, ob isSame irgendwo true ist.
payload.payload[isSame] ? payload.payload[isSame].%.Ferien : "keine Ferien"
-
@mickym said in JSONata loop - $moment > Invalid date?:
Wow, herzlichen Dank für deine Unterstützung.
Die Ausgabe der Ferien auf einmal ist genial.
Der Vergleich hätte mich fast noch zum Verzeifeln gebracht. Da war das Umrechnung wegzulassen ausschlaggebend.Das mit dem payload im payload ist wirklich nicht optimal.
Bei den ersten 3 Zeilen$start, $end, $diff
im payload wird in der Ausgabe des payloads nur der letzte Wert, also$diff
ausgegeben.
So wollte ich es eigentlich für$isSame
auch machen. Nur habe ich es anders mit der Schleife nicht hinbekommen.payload.{ "Ferien": $.name[language="DE"].text, "start": $moment($.startDate,'YYYY-MM-DD').format('DD.MM.YYYY'), "end": $moment($.endDate,'YYYY-MM-DD').format('DD.MM.YYYY'), "payload": ( $start := $moment($moment($.startDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $end := $moment($moment($.endDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $diff := $end.diff($start, 'days'); ([0..$diff])@$day.{ "date": $moment($.startDate,'YYYY-MM-DD').add($day,'days').format('DD.MM.YYYY'), "today": $moment().format('DD.MM.YYYY'), "isSame": $moment($.startDate,'YYYY-MM-DD').add($day,'days').isSame($moment(),'day') } ) }
Bei den Feiertagen funktioniert es so, dass nur ein Wert übers payload ausgegeben wird.
[ { "Feiertag":"Neujahr", "payload": ( $date := $moment($moment(payload[0].startDate,'YYYY-MM-DD').format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $today := $moment($moment().format('DD.MM.YYYY'),['DD.MM.YYYY','x'],'de'); $date.isSame($today) ) } ].payload
-
@mage sagte in JSONata loop - $moment > Invalid date?:
Der Vergleich hätte mich fast noch zum Verzeifeln gebracht. Da war das Umrechnung wegzulassen ausschlaggebend.
Naja - ich hab doch auch tüfteln und probieren müssen. Aber manchmal macht das auch Spaß. Solche Fehler halt in den Bibliotheken, dass ein Vergleich nur in eine Richtung funktioniert muss man erst mal rausbekommen - da war ich auch schon am Verzweifeln - aber so denke ich hat man eine gute Lösung.
-
@mickym said in JSONata loop - $moment > Invalid date?:
Spaß macht es auf jeden Fall. Ich stoße beim tüfteln nur oft an meine Grenzen. JSONata ist für mich noch Neuland.
Nochmal vielen lieben Dank, dass du dich da so reingefuchst hast.
@mickym
Mein fertiger Flow für Feiertage und Schulferien zusammen:
Nebenbei. Ist absolut erstaunlich wie enorm man einen Flow verschlanken kann.
- Flow für die Feiertage:
- Flow für die Feiertage:
Und der absolute Wahnsinn war das Abrufen auf einmal.
Dadurch redziert sich alleine bei den Feiertagen das JSONata von 106 auf 8 Zeilen in der change-node. - Flow für die Feiertage: