Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Anzahl der Tage nach Datum

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Anzahl der Tage nach Datum

    This topic has been deleted. Only users with topic management privileges can see it.
    • metaxa
      metaxa @TT-Tom last edited by

      @tt-tom sagte in Anzahl der Tage nach Datum:

      die npm Seite

      https://www.npmjs.com/package/duration

      1 Reply Last reply Reply Quote 0
      • T
        TT-Tom @metaxa last edited by TT-Tom

        @metaxa bei mir kommen 96 raus. Formatierungensfehler der Zellen vielleicht.

        metaxa 1 Reply Last reply Reply Quote 0
        • metaxa
          metaxa @TT-Tom last edited by metaxa

          @tt-tom sagte in Anzahl der Tage nach Datum:

          bei mir kommen 96 raus.

          Korrekt, in Excel habe ich es richtig gestellt, sorry mein Fehler. Ein Rätsel bleibt mir aber die Berechnung der duration function.

          T 1 Reply Last reply Reply Quote 0
          • T
            TT-Tom @metaxa last edited by

            @metaxa

            Ja das ist komisch. Komme aktuell nicht an mein Rechner, um selber zu testen.

            mickym 1 Reply Last reply Reply Quote 0
            • mickym
              mickym Most Active @TT-Tom last edited by mickym

              Das Problem ist, wenn Du bei Date nicht über eine Array initialisierst sondern Date mit dem normalen Konstruktor verwendest, (s. Date Funktion), dann wird der Januar mit Index 0 gezählt.

              18e36f61-dc9b-4a16-ac68-024854e0820b-image.png

              Siehe hier: https://www.w3schools.com/js/js_dates.asp

              Um also den 12.April 2022 zu bekommen musst Du beim Monat eines abziehen.

              var Duration = require("duration");
              
              var duration = new Duration(new Date(2022,3,12));
              return duration.days;
              

              Sprich in deinem 2. Beispiel berechnest Du die Tage seit dem 12. Mai 2022 anstelle des Aprils.

              Intern scheint bei einer Array Übergabe, dieses als String konvertiert zu werden siehe hier und somit in einen String konvertiert zu werden.

              2acf4b04-f375-44bf-aa7a-e3bd03f0478c-image.png

              Als String wird es dann wieder korrekt interpretiert:

              var Duration = require("duration");
              
              var duration = new Duration(new Date("2022,4,12"));
              return duration.days;
              
              

              Wenn Du Dir das Datum als String ausgeben lässt, dann siehst Du es ja:

              var Duration = require("duration");
              
              // var duration = new Duration(new Date("2022,4,12"));
              // return duration.days;
              
              const d = new Date(2022,4,12);
              return d;
              

              ergibt dann:
              b9d7fd46-1747-456e-944c-6acd6e45da5b-image.png

              1 Reply Last reply Reply Quote 1
              • mickym
                mickym Most Active last edited by mickym

                Sorry - für die Verwirrung -

                @metaxa Somit kannst Du Deinen Datenpunkt als String direkt der duration Bibliothek übergeben, da dann das Datum aus einem String gebildet wird:

                0be459bb-1dc7-4d4f-a721-b699b0c396f4-image.png

                Also sorry nochmal. Aber so ist es ja auch noch einfacher und spart sich die Umrechnerei halt komplett. Man muss halt nur darauf achten, dass der String das Format YYYY/MM/DD hat. Ich lerne auch jeden Tag dazu. 😉

                T metaxa 2 Replies Last reply Reply Quote 1
                • T
                  TT-Tom @mickym last edited by

                  @mickym sagte in Anzahl der Tage nach Datum:

                  Man muss halt nur darauf achten, dass der String das Format YYYY/MM/DD hat.

                  @metaxa
                  das meine ich vor hin. Kann mir nur die Reihenfolge nicht merken.

                  mickym 1 Reply Last reply Reply Quote 0
                  • mickym
                    mickym Most Active @TT-Tom last edited by

                    @tt-tom Daran lags aber nicht. Der String im Datenpunkt ist ja richtig. Das Problem war, dass @metaxa das Datum direkt konstruiert hat und dann muss halt bei Monat 1 abgezogen werden, da die Monate mit Index 0 in Javascript beginnen.

                    T 1 Reply Last reply Reply Quote 0
                    • T
                      TT-Tom @mickym last edited by

                      @mickym
                      Ah, okay. Das Problem tritt aber nur auf, wenn man kein Enddatum angibt. Gruß Tom

                      mickym 1 Reply Last reply Reply Quote 0
                      • mickym
                        mickym Most Active @TT-Tom last edited by mickym

                        @tt-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.asp

                        Das 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.

                        T 1 Reply Last reply Reply Quote 2
                        • T
                          TT-Tom @mickym last edited by TT-Tom

                          @mickym

                          Jetzt habe ich es verstanden. Dann ist es aber auf der Seite von npmjs falsch beschrieben oder ist das da wieder etwas anderes??
                          Link

                          mickym 1 Reply Last reply Reply Quote 1
                          • mickym
                            mickym Most Active @TT-Tom last edited by

                            @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.

                            T 1 Reply Last reply Reply Quote 1
                            • metaxa
                              metaxa @mickym last edited by

                              @mickym & @TT-Tom

                              Vorneweg, herzlichsten Dank für den Crashkurs in JS 😵 , einfach super wie die dieses Forum funktioniert. Kaum geht man kurz essen, liegt die Lösung & ERKLÄRUNG schon am Nachtisch 🙂

                              Hier meine finale Umsetzung
                              0b6ecb5d-9d65-44c3-8707-04f60fdc804f-image.png

                              Lieben Dank aus Wien
                              mxa

                              1 Reply Last reply Reply Quote 1
                              • T
                                TT-Tom @mickym last edited by

                                @mickym

                                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

                                metaxa 1 Reply Last reply Reply Quote 1
                                • metaxa
                                  metaxa @TT-Tom last edited by

                                  @mickym & @tt-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.

                                  T 1 Reply Last reply Reply Quote 0
                                  • T
                                    TT-Tom @metaxa last edited by

                                    @metaxa hier wurde das schon mal behandelt

                                    Link Text

                                    metaxa 1 Reply Last reply Reply Quote 1
                                    • metaxa
                                      metaxa @TT-Tom last edited by

                                      @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.

                                      mickym 1 Reply Last reply Reply Quote 0
                                      • mickym
                                        mickym Most Active @metaxa last edited by mickym

                                        @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.

                                        metaxa 1 Reply Last reply Reply Quote 1
                                        • metaxa
                                          metaxa @mickym last edited by

                                          @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.

                                          mickym 1 Reply Last reply Reply Quote 0
                                          • mickym
                                            mickym Most Active @metaxa last edited by mickym

                                            @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):

                                            7bbbee6f-7cf8-4c40-a04b-df7be96bb41a-image.png

                                            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. 😉

                                            c358baf0-ab34-45f0-a767-59a4e5d13d33-image.png

                                            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:

                                            <xml xmlns="https://developers.google.com/blockly/xml">
                                             <variables>
                                               <variable id=")_WmmKyNEo=;|R/~e$hK">Anfang</variable>
                                               <variable id="}5CPYSJ=hwX%JYD`VX#_">Ende</variable>
                                               <variable id="GJ2X+W~B7(ELIzd~F=o0">Datum</variable>
                                               <variable id="7,6IdwYUIp%d:m5OOj~;">Tage</variable>
                                             </variables>
                                             <block type="procedures_defcustomreturn" id="y)4fJSiHkYC};llO^|]/" x="-1638" y="-312">
                                               <mutation statements="false">
                                                 <arg name="Anfang" varid=")_WmmKyNEo=;|R/~e$hK"></arg>
                                                 <arg name="Ende" varid="}5CPYSJ=hwX%JYD`VX#_"></arg>
                                               </mutation>
                                               <field name="NAME">Moment_Differenz</field>
                                               <field name="SCRIPT">dmFyIG1vbWVudCA9IHJlcXVpcmUoICJtb21lbnQiKTsKCnZhciBhbmZhbmcgPSBuZXcgbW9tZW50KEFuZmFuZywiREQuTU0uWVlZWSIpOwp2YXIgZW5kZSA9IEVuZGUgPyBtb21lbnQoRW5kZSwiREQuTU0uWVlZWSIpIDogbmV3IG1vbWVudCgpOwoKcmV0dXJuIGVuZGUuZGlmZihhbmZhbmcsJ2RheXMnKTsK</field>
                                               <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
                                             </block>
                                             <block type="procedures_defcustomreturn" id="2?TcSF@Q3.XiF+w^x56d" x="-1638" y="-263">
                                               <mutation statements="false">
                                                 <arg name="Datum" varid="GJ2X+W~B7(ELIzd~F=o0"></arg>
                                                 <arg name="Tage" varid="7,6IdwYUIp%d:m5OOj~;"></arg>
                                               </mutation>
                                               <field name="NAME">Moment_AddiereTage</field>
                                               <field name="SCRIPT">dmFyIG1vbWVudCA9IHJlcXVpcmUoICJtb21lbnQiKTsKCnZhciBkYXR1bSA9IERhdHVtID8gbmV3IG1vbWVudChEYXR1bSwiREQuTU0uWVlZWSIpIDogbmV3IG1vbWVudCgpOwpkYXR1bSA9IGRhdHVtLmFkZChUYWdlLCdkYXlzJyk7CgpyZXR1cm4gZGF0dW0uZm9ybWF0KCdERC5NTS5ZWVlZJyk7</field>
                                               <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
                                             </block>
                                             <block type="debug" id="hBxQi:-}r-!f4`-k6Mx1" x="-1637" y="-188">
                                               <field name="Severity">log</field>
                                               <value name="TEXT">
                                                 <shadow type="text" id="~`tNWpp2ZX(41v=jX9rk">
                                                   <field name="TEXT">test</field>
                                                 </shadow>
                                                 <block type="procedures_callcustomreturn" id="gXBc5Mpo557/;-XL:})[">
                                                   <mutation name="Moment_Differenz">
                                                     <arg name="Anfang"></arg>
                                                     <arg name="Ende"></arg>
                                                   </mutation>
                                                   <value name="ARG0">
                                                     <block type="text" id="55*#_?kbQ`bR8QgRg%Bh">
                                                       <field name="TEXT">12.04.2022</field>
                                                     </block>
                                                   </value>
                                                   <value name="ARG1">
                                                     <block type="text" id="2N.XgvxjFAVF-haH^j7g">
                                                       <field name="TEXT">16.07.2022</field>
                                                     </block>
                                                   </value>
                                                 </block>
                                               </value>
                                               <next>
                                                 <block type="debug" id=";4A]%ih-j@_2.Hb]#f@x">
                                                   <field name="Severity">log</field>
                                                   <value name="TEXT">
                                                     <shadow type="text" id="x*[d7:DM=|PXL#4;dba.">
                                                       <field name="TEXT">test</field>
                                                     </shadow>
                                                     <block type="procedures_callcustomreturn" id=".LnKe$tneQ?)oULp7(4_">
                                                       <mutation name="Moment_Differenz">
                                                         <arg name="Anfang"></arg>
                                                         <arg name="Ende"></arg>
                                                       </mutation>
                                                       <value name="ARG0">
                                                         <block type="text" id="|y(F{I3+VUxW.m2z(jj[">
                                                           <field name="TEXT">12.04.2022</field>
                                                         </block>
                                                       </value>
                                                       <value name="ARG1">
                                                         <block type="text" id="ovE;8afL.d+r@FAPDKDt">
                                                           <field name="TEXT"></field>
                                                         </block>
                                                       </value>
                                                     </block>
                                                   </value>
                                                 </block>
                                               </next>
                                             </block>
                                             <block type="debug" id="@7:I5KP{7ID{_X.x_6A7" x="-1588" y="187">
                                               <field name="Severity">log</field>
                                               <value name="TEXT">
                                                 <shadow type="text" id="Nb:y;@-.`)6G}1nRKOIe">
                                                   <field name="TEXT">test</field>
                                                 </shadow>
                                                 <block type="procedures_callcustomreturn" id="]50S50fb;0pET(XGL3G#">
                                                   <mutation name="Moment_AddiereTage">
                                                     <arg name="Datum"></arg>
                                                     <arg name="Tage"></arg>
                                                   </mutation>
                                                   <value name="ARG0">
                                                     <block type="text" id="e-SvM0%C3{HkbOJKkeRL">
                                                       <field name="TEXT"></field>
                                                     </block>
                                                   </value>
                                                   <value name="ARG1">
                                                     <block type="math_number" id=")tEE[yu9dI[;Hk]hXG|q">
                                                       <field name="NUM">5</field>
                                                     </block>
                                                   </value>
                                                 </block>
                                               </value>
                                               <next>
                                                 <block type="debug" id="e[mHd;#GVDt[SzC-R{ly">
                                                   <field name="Severity">log</field>
                                                   <value name="TEXT">
                                                     <shadow type="text" id="?*jJi?+uW[Bk)_/PRdq$">
                                                       <field name="TEXT">test</field>
                                                     </shadow>
                                                     <block type="procedures_callcustomreturn" id="BG$CusF_8)K;V)bIsV5}">
                                                       <mutation name="Moment_AddiereTage">
                                                         <arg name="Datum"></arg>
                                                         <arg name="Tage"></arg>
                                                       </mutation>
                                                       <value name="ARG0">
                                                         <block type="text" id="PNZIB?*3#mK.nnD)%z{N">
                                                           <field name="TEXT">30.07.2022</field>
                                                         </block>
                                                       </value>
                                                       <value name="ARG1">
                                                         <block type="math_number" id="sotH9mM!(Z/B8%.r7A?Y">
                                                           <field name="NUM">5</field>
                                                         </block>
                                                       </value>
                                                     </block>
                                                   </value>
                                                 </block>
                                               </next>
                                             </block>
                                            </xml>
                                            

                                            metaxa 1 Reply Last reply Reply Quote 1
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            820
                                            Online

                                            31.7k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            8
                                            48
                                            2979
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo