Feedback

C# - Und nochmal eine Feiertagsberechnung

Veröffentlicht von am 12.11.2006
(2 Bewertungen)
Jedoch kann bei dieser Feiertagsberechnung das jeweilige Land mit berücksichtigt werden
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;



namespace BlackDragon.FeierTage {

    /// <summary>
    /// Und nochmal eine Feiertagsberechnung 
    /// </summary>
    public class FeierTage {
        private List<FeierTag> feiertage = new List<FeierTag>();

        public FeierTage() {
            Initial();
        }


        /// <summary>
        /// Den möglichen Feiertags anhand des Datums und des jeweiligen Bundes Landes ermitteln
        /// </summary>
        /// <param name="datum">Das Datum, daß zur ermittlung herrangezogen werden soll</param>
        /// <param name="land">Das jeweilige Land</param>
        /// <returns>Der jeweilige Feiertag als Text</returns>
        public String GetFeiertag(DateTime datum, Land land) {

            // Liste der Feiertage durchgehen
            foreach (FeierTag f in feiertage) {
                if (datum.ToShortDateString().Equals(f.GetDatum(GetOstersonntag(datum.Year)).ToShortDateString())) {
                    // Prüfen ob das Land enthalten ist
                    foreach (Land l in f.Länder) {
                        if (land == l) {
                            return f.Feiertag;
                        }
                    }
                }
            }
            return "";
        }

        /// <summary>
        /// Einfache Abfrage ob das übergeben Datum in dem jeweiligen Land ein Feiertag ist
        /// </summary>
        /// <param name="datum">Das Datum, daß zur ermittlung herrangezogen werden soll</param>
        /// <param name="land">Das jeweilige Land</param>
        /// <returns>Wahr oder Falsch</returns>
        public Boolean IsFeiertag(DateTime date, Land land) {
            return (GetFeiertag(date, land).Length > 0);
        }

        /// <summary>
        /// Errechnet das Datum des Ostersonntags aus dem übergebenen Jahr
        /// </summary>
        /// <param name="int">Das Jahr in YYYY Schreibweise</param>
        /// <returns>Das errechnete Datum des Ostersonnsags in dem angegebene Jahr</returns>
        private DateTime GetOstersonntag(int jahr) {
            int c;
            int i;
            int j;
            int k;
            int l;
            int n;
            int OsterTag;
            int OsterMonat;
           
            c = jahr / 100;
            n = jahr - 19 * ((int)(jahr / 19));
            k = (c - 17) / 25;
            i = c - c / 4 - ((int)(c - k) / 3) + 19 * n + 15;
            i = i - 30 * ((int)(i / 30));
            i = i - (i / 28) * ((int)(1 - (i / 28)) * ((int)(29 / (i + 1))) * ((int)(21 - n) / 11));
            j = jahr + ((int)jahr / 4) + i + 2 - c + ((int)c / 4);
            j = j - 7 * ((int)(j / 7));
            l = i - j;

            OsterMonat = 3 + ((int)(l + 40) / 44);
            OsterTag = l + 28 - 31 * ((int)OsterMonat / 4);

            return Convert.ToDateTime(OsterTag.ToString() + "." + OsterMonat + "." + jahr);
        }


        /// <summary>
        /// Die einzelnen möglichen Feiertage 
        /// kan natürlich noch erweitert werden
        /// </summary>
        private void Initial() {
            Land[] alle = new Land[] { Land.Baden_Würtenberg, Land.Bayern, Land.Berlin, Land.Brandenburg, Land.Bremen, Land.Hamburg, Land.Hessen, Land.Mecklenburg_Vorpommern, Land.Niedersachsen, Land.Nordrhein_Westfalen, Land.Rheinland_Pfalz, Land.Saarland, Land.Sachsen, Land.Sachsen_Anhalt, Land.Schleswig_Holstein, Land.Thüringen };

            feiertage.Add(new FeierTag("Neujahr","01.01", FeiertagsArt.Fester_Feiertag, alle));
            feiertage.Add(new FeierTag("Heiligen Drei Könige", "06.01", FeiertagsArt.Fester_Feiertag, new Land[] { Land.Baden_Würtenberg, Land.Bayern, Land.Sachsen_Anhalt }));
            feiertage.Add(new FeierTag("Karfreitag", -2, FeiertagsArt.Bewegliche_Feiertag, alle));
            feiertage.Add(new FeierTag("Ostersonntag", 0, FeiertagsArt.Bewegliche_Feiertag, alle));
            feiertage.Add(new FeierTag("Ostermontag", 1, FeiertagsArt.Bewegliche_Feiertag, alle));
            feiertage.Add(new FeierTag("Tag der Arbeit", "01.05", FeiertagsArt.Fester_Feiertag, alle));
            feiertage.Add(new FeierTag("Christi Himmelfahrt", 39, FeiertagsArt.Bewegliche_Feiertag , alle));
            feiertage.Add(new FeierTag("Pfingstsonntag", 49, FeiertagsArt.Bewegliche_Feiertag, alle));
            feiertage.Add(new FeierTag("Pfingstmontag", 50, FeiertagsArt.Bewegliche_Feiertag, alle));
            feiertage.Add(new FeierTag("Fronleichnam", 60, FeiertagsArt.Bewegliche_Feiertag, new Land[] { Land.Baden_Würtenberg, Land.Bayern, Land.Hessen, Land.Nordrhein_Westfalen, Land.Rheinland_Pfalz,Land.Saarland}));
            feiertage.Add(new FeierTag("Mariä Himmelfahrt", "15.08", FeiertagsArt.Fester_Feiertag, new Land[] { Land.Saarland }));
            feiertage.Add(new FeierTag("Tag der dt. Einheit", "03.10", FeiertagsArt.Fester_Feiertag, alle ));
            feiertage.Add(new FeierTag("Allerheiligen", "01.11", FeiertagsArt.Fester_Feiertag, new Land[] { Land.Baden_Würtenberg,Land.Bayern,Land.Nordrhein_Westfalen,Land.Rheinland_Pfalz,Land.Saarland }));
            feiertage.Add(new FeierTag("1. Weinachtstag", "25.12", FeiertagsArt.Fester_Feiertag, alle));
            feiertage.Add(new FeierTag("2. Weinachtstag", "26.12", FeiertagsArt.Fester_Feiertag, alle));

        }
    }

    /// <summary>
    /// Die eigentliche Klasse der einzelnen Feiertage
    /// </summary>
    internal class FeierTag {
        private FeiertagsArt art;
        private string feiertag;
        private DateTime datum;
        private string testDatum;
        private int tageHinzu;
        private Land[] länder;

        public String Feiertag {
            get {
                return this.feiertag;
            }
        }
        public DateTime Datum {
            get {
                return this.datum;
            }
        }
        public Land[] Länder {
            get {
                return länder;
            }
        }

        internal FeierTag(String feiertag, String testDatum, FeiertagsArt art, Land[] länder) {
            this.feiertag = feiertag;
            this.testDatum = testDatum;
            this.tageHinzu = 0;
            this.art = art;
            this.länder = länder;
        }
        internal FeierTag(String feiertag, int tageHinzu, FeiertagsArt art, Land[] länder) {
            this.feiertag = feiertag;
            this.tageHinzu = tageHinzu;
            this.art = art;
            this.länder = länder;
        }
        
        public DateTime GetDatum(DateTime osterSonntag) {
            if (this.art != FeiertagsArt.Fester_Feiertag) {
                datum = osterSonntag.AddDays(this.tageHinzu);
            } else {
                datum = DateTime.Parse(testDatum + "." + osterSonntag.Year);
            }

            return DateTime.Parse(datum.Day.ToString() + "." + datum.Month.ToString() +"."+ osterSonntag.Year);
        }
    }

    public enum Land {
        Baden_Würtenberg,
        Bayern,
        Berlin,
        Brandenburg,
        Bremen,
        Hamburg,
        Hessen,
        Mecklenburg_Vorpommern,
        Niedersachsen,
        Nordrhein_Westfalen,
        Rheinland_Pfalz,
        Saarland,
        Sachsen,
        Sachsen_Anhalt,
        Schleswig_Holstein,
        Thüringen
    }
    public enum FeiertagsArt {
        Fester_Feiertag,
        Bewegliche_Feiertag
    }
}

Abgelegt unter Feiertage, Osterformel.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!