Ankündigung

Einklappen
Keine Ankündigung bisher.

Feiertage erkennen

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Feiertage erkennen

    Hallo zusammen!

    Ich verwende für einige Funktionen auch eine Unterscheidung ob Wochentag/Wochenende und möchte dies nun mittels WG auf Feiertage erweitern.

    Ich würde gerne ein Array mit den allgemeinen Feiertage (25.12, 1.1., etc.) machen und zusätzlich ein Array mit den variablen Feiertagen wie Ostern etc., das man dann von hand 1x jährlich anpassen muss.

    Wie habt ihr das gelöst?
    Hat schon jemand aus der aktuellen time() das Datum berechnet bzw. wie macht man am einfachsten den Vergleich (heute == 8.12.) unabhängig vom Jahr?

    Danke für eure Anregungen,
    lg Robert M.

    #2
    Hoi

    Es gibt in verschiedenen Programmiersprachen eine Formel für bewegliche Feiertage.
    (php: Funktion easter_date() ) (perl: Easter_Sunday() (Modul Date::Calc))
    Von Ostern lassen sich die anderen beweglichen Feiertage einfach ableiten (plus oder minus x Tage)

    Sehr gut: PS-Trainer

    Oster-Formel mit Perl

    Funktion Easter_Sunday()

    Die Programmiersprache → Perl bietet im Modul Date::Calc die Funktion Easter_Sunday()
    Vom Modul Date werden entweder alle Funktionen (hier mit Kommentar abtgeschaltet) oder nur die verwendete Funktion in das Programm eingebunden.
    Die Funktion erhält als Argument das gesuchte Jahr und liefert eine Liste von 3 Zahlen (Jahr,Monat,Tag) des Ostersonntags.
    oder tutorials ostern berechnen php
    Grüsse Bodo
    Fragen gehören ins Forum, und nicht in mein Postfach;
    EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

    Kommentar


      #3
      Zitat von Robert_Mini Beitrag anzeigen
      machen und zusätzlich ein Array mit den variablen Feiertagen wie Ostern etc., das man dann von hand 1x jährlich anpassen muss.
      Ich hab mal für ein Web-Projekt einen Kalender erstellt. Für die variablen Feiertage verwendest Du am besten die https://de.wikipedia.org/wiki/Gau%C3%9Fsche_Osterformel

      In VBScript sähe das bspw. so aus:
      Code:
      Function GetEasterSunday(ByRef intYear)
          Dim d0
          Dim d1
          Dim d2
          Dim d3
          Dim d4
          Dim d5
          Dim d6
          Dim d7
          Dim d8
          Dim d9
          
          If intYear = 0 Then
              intYear = Year(Date())
          End If
          
          d0 = Int(intYear / 100)
          d1 = 15 + Int((3 * d0 + 3) / 4) - Int((8 * d0 + 13) / 25)
          d2 = 2 - Int((3 * d0 + 3) / 4)
          d3 = intYear Mod 19
          d4 = (19 * d3 + d1) Mod 30
          d5 = Int(d4 / 29) + (Int(d4 / 28) - Int(d4 / 29)) * Int(d3 / 11)
          d6 = Int(21 + d4 - d5)
          d7 = 7 - (intYear + Int(intYear / 4) + d2) Mod 7
          d8 = 7 - (d6 - d7) Mod 7
          d9 = d6 + d8
          GetEasterSunday = DateSerial(intYear, 3, d9)
      End Function
      Zurück bekommst Du den Ostersonntag, von dem Du die restlichen Feiertage ableiten kannst.

      Code:
      For intYear = Year(arrDate(0)) To Year(arrDate(1))
              dtmEasterSunday = GetEasterSunday(intYear)
              arrPeriodeYearHolidays(intPeriodeYearHolidays) = dtmEasterSunday
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 1) = DateAdd("D", -2, dtmEasterSunday)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 2) = DateAdd("D", 1, dtmEasterSunday)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 3) = DateAdd("D", 39, dtmEasterSunday)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 4) = DateAdd("D", 49, dtmEasterSunday)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 5) = DateAdd("D", 50, dtmEasterSunday)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 6) = DateAdd("D", 60, dtmEasterSunday)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 7) = DateSerial(intYear, 1, 1)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 8) = DateSerial(intYear, 1, 6)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 9) = DateSerial(intYear, 5, 1)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 10) = DateSerial(intYear, 10, 3)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 11) = DateSerial(intYear, 12, 25)
              arrPeriodeYearHolidays(intPeriodeYearHolidays + 12) = DateSerial(intYear, 12, 26)
              intPeriodeYearHolidays = intPeriodeYearHolidays + 13
          Next
      Beachte noch die unterschiedlichen Feiertage der einzelnen Bundesländer (Übersicht bundeseinheitlicher Feiertage in Deutschland.).
      Gruß
      Karsten

      Kommentar


        #4
        Im Logikprozessor (->SVN) ist auch eine kleine Routine fürs Osterdatum drin, die kannst du verwenden. Sie beruht letztlich auf der Gauss/Lichtenberg-Formel und ist getestet; Ergebnisse stimmen für mindestens 100 Jahre nach vorn und hinten.
        VG, Fry

        Kommentar


          #5
          Zitat von Bodo Beitrag anzeigen
          Hoi
          (perl: Easter_Sunday() (Modul Date::Calc))

          Sehr gut: PS-Trainer
          Danke für die Hinweise. Der Link ist wirklich perfekt.

          Werde diese Anwendung nutzen um mich ein wenig weiter in perl einzuarbeiten (und dann hier im Forum einstellen)

          Dazu hab ich gleich noch eine Frage. Wie kann man am WG Zusatzfunktionen einbinden? Folgender code
          Code:
          use Date::Calc qw(Add_Delta_Days);
          ($y2, $m2, $d2) = Add_Delta_Days($y, $m, $d, $offset);
          liefert nachstehenden Fehler:
          HTML-Code:
          Can't locate Date/Calc.pm in @INC (@INC contains: /etc/perl 
           /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5  
          /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10  /usr/local/lib/site_perl .) 
          at (eval 117096) line 4. BEGIN failed--compilation aborted at (eval 117096) line 4.
          Danke
          Robert

          Kommentar


            #6
            Erledigt!

            Code:
            apt-get install libdate-calc-perl
            löst das Problem. lg Robert

            Kommentar


              #7
              Nur der Vollständigkeit halber, hatte ich mal gebookmarked: hier gibts die Feiertage pro Land als CSV und für Outlook..

              Makki
              EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
              -> Bitte KEINE PNs!

              Kommentar

              Lädt...
              X