Ankündigung

Einklappen
Keine Ankündigung bisher.

easterday()

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [EibStudio] easterday()

    Lt. Handbuch erwartet easterday() den Offset als s16.
    Bei positiven Offset darf man s16 aber nicht angeben, führt zum Fehler, da funktioniert nur easterday( +1)
    Bei negativen Offset MUSS man dagegen s16 angeben, damit es zu keinem Fehler kommt, da funktioniert nur easterday( -2s16)

    Soll das so sein?
    ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

    #2
    Kann ich nicht nachvollziehen. Folgendes lässt sich fehlerfrei kompilieren:
    Code:
    uDay = easterday(5);
    uDay = easterday(5s16);
    uDay = easterday(-2s16);
    Nur folgendes ist nicht erlaubt:
    Code:
    uDay = easterday(-2);
    Firma: Enertex Bayern GmbH, Ebermannstädter Straße 8, 91301 Forchheim
    Amazon: KNXnet/IP Router
    , KNXnet/IP Interface

    Kommentar


      #3
      Zitat von salixer Beitrag anzeigen
      Kann ich nicht nachvollziehen. Folgendes lässt sich fehlerfrei kompilieren:
      Code:
      1 uDay = easterday(5);
      2 uDay = easterday(5s16);
      3 uDay = easterday(-2s16);
      Nur folgendes ist nicht erlaubt:
      Code:
      4 uDay = easterday(-2);
      Hab mal Deine Beispiele nummeriert
      3 und 4 kann ich bestätigen, hatte ich ja auch gesagt.

      1 und 2 hab ich (vermutlich, hab grad keinen Zugriff auf den Code) NICHT getestet! Soweit ich mich entsinne hatte ich:
      Code:
      5 uDay = easterday( +5s16);
      6 uDay = easterday( +5);
      versucht.
      Nr. 5 führt zum Fehler, Nr. 6 geht.

      Unterschied ist also, dass ich auch bei den positiven Zahlen ein Vorzeichen genommen habe, da ich das aufgrund des Handbuchs so verstanden hatte:
      Code:
      Dabei wird ein Offset für das Berechnungsergebnis angegeben, z.B. Ostersonntag [B]+40[/B] Tage, Ostersonntag – 30 Tage.
      Das Code-Beispiel im Handbuch hat nur ein negatives Offset.

      Also letztlich mein Fehler, aber man sollte im Handbuch ein Beispiel mit positiven Offset ergänzen und die Nr. 6 von oben sollte evtl. dann konsequent auch zum Fehler führen.
      ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

      Kommentar


        #4
        Hi Uwe,

        ok, jetzt ist es klar. Bei Funktionsaufrufen mit positiven Zahlen wird grundsätzlich das Vorzeichen (+) nicht angegeben. Ich gebe deinen Report mal weiter.
        Firma: Enertex Bayern GmbH, Ebermannstädter Straße 8, 91301 Forchheim
        Amazon: KNXnet/IP Router
        , KNXnet/IP Interface

        Kommentar


          #5
          Eigentlich normal, nur weil das als Offset bezeichnet ist und im Text halt auch +50/-50 steht, war für mich logisch, dass hier ein Plus davor muss!
          ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

          Kommentar


            #6
            Also richtig ist nur der Datentyp s16. +5 oder 5 ist ja per Definition u08 und daher ist das nicht zulässig und falsch - ist also ein Bug im Compiler, wird gefixt).Das +5s16 ist syntaktisch korrekt, aber auch ein Bug im Compiler.
            wird in der nächsten Runde gefixt. Bitte immer nur s16 als Datentyp nehmen.
            Es ist also nur zulässig:
            Code:
            uDay = easterday(5s16);
            uDay = easterday(+5s16);
            uDay = easterday(-2s16);
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              Hallo Leute,

              hat denn jemand schon ein funktionierendes Makro erstellt, mit allen variablen Feiertagen bezogen auf easterday()?

              Lg Martin
              MfG MrKnx

              Kommentar


                #8
                Makro nicht, aber 4, 5 Zeilen Programmcode, die mir die Feiertage berechnen, hab ich. Kann ich später gern mal zeigen.
                ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                Kommentar


                  #9
                  Super, das würde schon weiterhelfen

                  LG
                  MfG MrKnx

                  Kommentar


                    #10
                    Wo ist genau das Problem? Ist die Anwendung unklar?
                    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                    Enertex Produkte kaufen

                    Kommentar


                      #11
                      ich habs bei mir so gelöst:
                      Code:
                      //Feiertage
                      FT_OM    = date(easterday( 1s16), eastermonth( 1s16), Jahr2) and !date(easterday( 2s16), eastermonth( 2s16), Jahr2)
                      FT_KF    = date(easterday(-2s16), eastermonth(-2s16), Jahr2) and !date(easterday(-1s16), eastermonth(-1s16), Jahr2)
                      FT_CHF    = date(easterday(39s16), eastermonth(39s16), Jahr2) and !date(easterday(40s16), eastermonth(40s16), Jahr2)
                      FT_PM    = date(easterday(50s16), eastermonth(50s16), Jahr2) and !date(easterday(51s16), eastermonth(51s16), Jahr2)
                      FT_FL    = date(easterday(60s16), eastermonth(60s16), Jahr2) and !date(easterday(61s16), eastermonth(61s16), Jahr2)
                      
                      FT_NJ    = date(01, 01, Jahr2) and !date(02, 01, Jahr2)
                      FT_HDK    = date(06, 01, Jahr2) and !date(07, 01, Jahr2)
                      FT_1M    = date(01, 05, Jahr2) and !date(02, 05, Jahr2)
                      FT_TDDE    = date(03, 10, Jahr2) and !date(04, 10, Jahr2)
                      FT_AH    = date(01, 11, Jahr2) and !date(02, 11, Jahr2)
                      FT_HA    = date(24, 12, Jahr2) and !date(25, 12, Jahr2)
                      FT_1WT    = date(25, 12, Jahr2) and !date(26, 12, Jahr2)
                      FT_2WT    = date(26, 12, Jahr2) and !date(27, 12, Jahr2)
                      
                      Feiertag = FT_OM or FT_KF or FT_PM or FT_FL or FT_NJ or FT_HDK or FT_1M or FT_TDDE or FT_AH or FT_HA or FT_1WT or FT_2WT
                      Jahr2 ist das aktuelle Jahr zweistellig
                      ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                      Kommentar


                        #12
                        Zitat von enertegus Beitrag anzeigen
                        Wo ist genau das Problem? Ist die Anwendung unklar?
                        Hallo,

                        unklar ist die Anwendung nicht, dachte nur, wenn es schon ein fertiges Makro gibt, könnte ich das übernehmen und nicht das Rad neu erfinden.

                        @Uwe: Danke

                        Lg Martin
                        MfG MrKnx

                        Kommentar


                          #13
                          Hallo,

                          ich berechne bei mir die Feiertage zum Jahresbeginn als fortlaufende Zahl ( Basis UTC ) und wandle dann in Stringformat um zur Anzeige auf einer Übersichtsseite:
                          Code:
                          /* Bestimmung OsterTag    */;
                              c_OsternDate = WE_Ostertag( c_KalJahr, c_KalOsterTag, c_KalOsterMon );    /* Berechnung OsterTag        */;
                              /* AnzTage bis Ostern     */;
                              c_OsterDay = WE_Datwert( c_KalJahr, c_KalOsterMon, c_KalOsterTag );        
                              /* Berechnung der bewegl. Feiertage    */;
                              /* in Anzahl Tagen !            */;
                              c_AschermittwochDay = c_OsterDay - 46s32;
                              c_FaschingsDay = c_AschermittwochDay - 1s32;
                              c_KarfreitagDay = c_OsterDay - 2s32;
                              c_OstermontagDay = c_OsterDay + 1s32;
                              c_HimmelfahrtDay = c_OsterDay + 39s32;
                              c_PfingstDay = c_OsterDay + 49s32;
                              c_PfingstmontagDay = c_PfingstDay + 1s32;
                              c_FronleichDay = c_OsterDay + 60s32;
                          
                              /* Bestimmung der fixen Tage        */;
                              /* in Anzahl Tagen !            */;    
                              c_NeujahrDay = WE_Datwert( c_KalJahr, 1s32, 1s32 );
                              c_WeihnachtsDay = WE_Datwert( c_KalJahr, 12s32, 25s32 );
                              c_Weihnachts2Day = WE_Datwert( c_KalJahr, 12s32, 26s32 );
                              c_HlDreiKoenigeDay = WE_Datwert( c_KalJahr, 1s32, 6s32 );
                              c_ErsterMaiDay = WE_Datwert( c_KalJahr, 5s32, 1s32 );
                              c_TagDerDeutschenEinheitDay = WE_Datwert( c_KalJahr, 10s32, 3s32 );
                              c_AllerheiligenDay = WE_Datwert( c_KalJahr, 11s32, 1s32 );
                          
                              /* Berechnung Advent                */;
                              /* in Anzahl Tagen !                */;    
                              c_WoTag = Mod( c_WeihnachtsDay-c_OsterDay, 7s32 );
                              if c_WoTag == 0s32 then c_Advent4Day = c_WeihnachtsDay - 7s32
                              else c_Advent4Day = c_WeihnachtsDay - c_WoTag
                              endif;
                              c_Advent3Day = c_Advent4Day - 7s32;
                              c_Advent2Day = c_Advent3Day - 7s32;
                              c_Advent1Day = c_Advent2Day - 7s32;    
                          
                              /* Bestimmung der DatumStrings    */;
                              WE_DatwertToDate( c_Advent1, c_Advent1Day );
                              WE_DatwertToDate( c_Advent2, c_Advent2Day );
                              WE_DatwertToDate( c_Advent3, c_Advent3Day );
                              WE_DatwertToDate( c_Advent4, c_Advent4Day );
                              WE_DatwertToDate( c_Karfreitag, c_KarfreitagDay );
                              /* WE_DatwertToDate( c_Ostern, c_OsterDay )    */;    
                              WE_DatwertToDate( c_Ostermontag, c_OstermontagDay );
                              WE_DatwertToDate( c_Aschermittwoch, c_AschermittwochDay );
                              WE_DatwertToDate( c_Fasching, c_FaschingsDay );
                              WE_DatwertToDate( c_Himmelfahrt, c_HimmelfahrtDay );
                              WE_DatwertToDate( c_Pfingsten, c_PfingstDay );
                              WE_DatwertToDate( c_Pfingstmontag, c_PfingstmontagDay );
                              WE_DatwertToDate( c_Fronleich, c_FronleichDay )
                          Mit der Funktion DatWert berechne ich die laufende Zahl an Tagen im Jahr:

                          Code:
                          //***************************************************************************
                          //*    WE_Datwert                         FUNKTIONSMAKRO
                          //***************************************************************************
                          //*    Bestimmung der Anzahl Tage seit 1970
                          //*    ( mit utc-Funktion des EibPC ... )
                          //*     Jahr muss 4-Stellig sein !!
                          //***************************************************************************
                          
                          :begin WE_Datwert( utY, utMo, utD)
                          :info $Gegebenen Zeitpunkt mit Einzelangabe von Jahr, Monat in Datwert ab 1970 umwandeln$ \\
                              $Jahr$ \\
                              $Monat$ \\
                              $Tag$
                          
                          :shortinfo $Gegebes Datum in Datwert umwandeln$
                          
                          :var c_utc_s@
                          :var c_DatWert@
                          :var c_utc_d@
                          :var c_utc_d32@
                          
                          // UTC rechnet in ms => Umrechnung von ms auf Tage !
                          c_utc_s@ = convert( utY, $YYYY$ ) + $-$ + stringformat( utMo,0,3,2,2) + $-$ + stringformat( utD,0,3,2,2) + $ 00:00:00$
                          c_utc_d@ = utc( c_utc_s@ ) / ( 1000u64 * 3600u64 *24u64 )
                          
                          c_utc_d32@ = convert( c_utc_d@, 0s32 )
                          c_DatWert@ = c_utc_d32@
                          
                          :return c_DatWert@
                          :end
                          Und mit DatwertToDate - als Umkehrung - berechne ich einen Datumsstring zur Anzeige:

                          Code:
                          //***************************************************************************
                          //*    WE_DatwertToDate   mit UTC Funktion !
                          //***************************************************************************
                          //*    Bestimmt aus Datwert das Datum
                          //*    ( mit utc-Funktion des EibPC ... )
                          //*
                          //***************************************************************************
                          //*
                          //* ACHTUNG: berechnet Tage im aktuellen Jahr !!
                          
                          
                          :begin WE_DatwertToDate( Name, DayCount )
                          :info $Wandelt ein Datum auf Basis Datwert in 3 Variablen$ \\
                              $Name: der Variablen (wird ergänzt um Monat, Day, Year )$ \\
                              $Die aufzusplittende Unixzeit$
                          
                          :var c_DatWert@
                          :var c_utc_ms@
                          :var c_utc_s@
                          
                          Name^Date = $$
                          
                          // Umrechnung auf ms !
                          c_utc_ms@ = (1u64 + convert( DayCount, 0u64)) * 1000u64 * 3600u64 * 24u64
                          c_utc_s@ = utcconvert( c_utc_ms@ )
                          
                          Name^Jahr = c_KalJahr
                          Name^Monat = convert( split( c_utc_s@, 5u16, 6u16 ), 0s32 )
                          Name^Tag = convert( split( c_utc_s@, 8u16, 9u16 ), 0s32 )
                          
                          :return Name^Date = convert(Name^Tag, $$) + $.$ + convert( Name^Monat, $$ ) + $.$ + convert( Name^Jahr, $$ )
                          :end
                          Den Weg von Uwe! find ich ganz elegant - ich wollte aber nur zum Jahresanfang berechnen und mir auch Strings zur Anzeige generieren ...

                          Gruss

                          Wolfgang
                          ETS 6.2 EibPC V3.x

                          Kommentar


                            #14
                            Ich berechne ja auch nur zum Jahresanfang.
                            strings zur Anzeige hab ich so natürlich nicht, hatte ich überlegt, aber verworfen. Dafür gibt es Kalender, in Papier und elektronisch. Ich wollte nur, das der EibPC weiß, wann Feiertag ist, weil davon abhängig manches anders läuft.
                            ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                            Kommentar

                            Lädt...
                            X