Avatar billede lasserasch Juniormester
30. januar 2011 - 16:09 Der er 8 kommentarer

Beregning af helligdage i C#

Hejsa.

Er der nogle som har noget info omkring hvordan helligdage i DK beregnes i .Net?

Jeg kan finde eksempler på f.eks. påske søndag, men findes der ikke en smartere metode end at skulle ud og finde kodestumper for hver eneste helligdag?

Mvh.
Lasse
Avatar billede bvli Praktikant
30. januar 2011 - 16:35 #1
Øh?? Alle helligdage er baseret på påskesøndag.
Avatar billede bvli Praktikant
30. januar 2011 - 16:44 #2
Her er min DateTimeUtility. Den refererer nogle resourcer som ikke er der, men resten skulle compile:
----

using System;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using B.Common.Properties;
using System.Globalization;

namespace B.Common
{
    /// <summary>
    /// Contains <see cref="DateTime"/> utility methods.
    /// </summary>
    public static class DateTimeUtility
    {

        #region -- Moving holydays --
        /// <summary>
        /// Gets the carnival sunday
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        public static DateTime GetCarnival(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            DateTime result = CalculateEasterSunday(year).AddDays(-49);
            Debug.Assert(result.DayOfWeek == DayOfWeek.Sunday);
            return result;
        }


        /// <summary>
        /// Gets the palm sunday of the specified <paramref name="year"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        /// <remarks>Sunday before Easter.</remarks>
        public static DateTime GetPalmSunday(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            return CalculateEasterSunday(year).AddDays(-7);
        }

        /// <summary>
        /// Gets the maundy thursday of the specified <paramref name="year"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        /// <remarks>The Thursday before Easter; commemorates the Last Supper.</remarks>
        public static DateTime GetMaundyThursday(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            return CalculateEasterSunday(year).AddDays(-3);
        }
        /// <summary>
        /// Gets the good friday of the specified <paramref name="year"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        /// <remarks>Friday before Easter.</remarks>
        public static DateTime GetGoodFriday(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            return GetMaundyThursday(year).AddDays(1);
        }

        /// <summary>
        /// Gets the easter monday of the specified <paramref name="year"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public static DateTime GetEasterMonday(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            return CalculateEasterSunday(year).AddDays(1);
        }

        /// <summary>
        /// Gets the great prayer day of the specified <paramref name="year"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        /// <remarks>This is a specific danish holyday.</remarks>
        public static DateTime GetGreatPrayerDay(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            //fourth friday after easter.
            return CalculateEasterSunday(year).AddDays(5 + 3 * 7);
        }

        /// <summary>
        /// Gets the ascension day of the specified <paramref name="year"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        /// <remarks>Celebration of the Ascension of Christ into heaven; observed on the 40th day after Easter</remarks>
        public static DateTime GetAscensionDay(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            //sixth thursday after easter.
            return CalculateEasterSunday(year).AddDays(39);
        }

        /// <summary>
        /// Gets the whit sunday of the specified <paramref name="year"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        /// <remarks>Seventh Sunday after Easter; commemorates the emanation of the Holy Spirit to the Apostles; a quarter day in Scotland.</remarks>
        public static DateTime GetWhitSunday(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            return CalculateEasterSunday(year).AddDays(7 * 7);
        }

        /// <summary>
        /// Gets the whit monday of the specified <paramref name="year"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        /// <remarks>The day after Whitsunday; a legal holiday in England and Wales and Ireland.</remarks>
        public static DateTime GetWhitMonday(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            return GetWhitSunday(year).AddDays(1);
        }


        /// <summary>
        /// Gets ash wednesday.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns></returns>
        public static DateTime GetAshWednesday(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            return CalculateEasterSunday(year).AddDays(-46);
        }

        /// <summary>
        /// Calculates easter sunday for the specified <paramref name="year"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <returns>The <see cref="DateTime">date</see> of easter sunday.</returns>
        /// <remarks>This method uses the algorithm specified in the wikipedia article: <a href="http://en.wikipedia.org/wiki/Computus">Computus</a>.</remarks>
        public static DateTime CalculateEasterSunday(int year)
        {
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            int a = year % 19;
            int b = year / 100;
            int c = year % 100;
            int d = b / 4;
            int e = b % 4;
            int f = (b + 8) / 25;
            int g = (b - f + 1) / 3;
            int h = (19 * a + b - d - g + 15) % 30;
            int i = c / 4;
            int k = c % 4;
            int l = (32 + 2 * e + 2 * i - h - k) % 7;
            int m = (a + 11 * h + 22 * l) / 451;
            int month = (h + l - 7 * m + 114) / 31;
            int day = ((h + l - 7 * m + 114) % 31) + 1;
            return new DateTime(year, month, day).Date;
        }
        #endregion

        #region -- Weeknumber --
        /// <summary>
        /// Gets the week number of the specified date.
        /// </summary>
        /// <param path="year">The year.</param>
        /// <param path="month">The month.</param>
        /// <param path="day">The day.</param>
        /// <returns></returns>
        [SuppressMessage("Microsoft.Usage", "CA2233:OperationsShouldNotOverflow")]
        public static int WeekNumber(int year, int month, int day)
        {
            //hrmpf
            // System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("sv-SE", false);
            // int week = culture.Calendar.GetWeekOfYear(DateTime.Now, System.Globalization.CalendarWeekRule.FirstFourDayWeek, System.DayOfWeek.Monday);
            //
            if (year > DateTime.MaxValue.Year)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidYear, "year");
            }
            if (month > DateTime.MaxValue.Month)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidMonth, "month");
            }
            if (day > DateTime.MaxValue.Day)
            {
                throw new ArgumentException(Resources.DateTimeUtil_InvalidDay, "day");
            }
            int a = (14 - month) / 12;
            int y = year + 4800 - a;
            int m = month + 12 * a - 3;
            int JD = day + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 32045;
            int d4 = (((JD + 31741 - JD % 7) % 146097) % 36524) % 1461;
            int L = d4 / 1460;
            int d1 = ((d4 - L) % 365) + L;
            return d1 / 7 + 1;
        }

        /// <summary>
        /// Gets the week number of the specified date.
        /// </summary>
        /// <param path="date">The date.</param>
        /// <returns></returns>
        public static int WeekNumber(DateTime date)
        {
            DateTime dt = date.Date;
            return WeekNumber(dt.Year, dt.Month, dt.Day);
        }

        #endregion
    }
}
Avatar billede claes57 Ekspert
30. januar 2011 - 16:43 #3
de fleste bruger påske, og ud fra det lægger til/trækker fra for at finde de øvrige forskydelige helligdage.
Nytår, hellig 3 konger, jul og grundlovsdag er faste. Og advent er lidt speciel De 4 sidste søndage før 25/12.
Avatar billede arne_v Ekspert
30. januar 2011 - 20:09 #4
Det er relativt nemt at beregne helligdagene, når man har en veldefineret beskrivelse af hvordan deres dato beregnes.

Men der er et par ting du muligvis skal være opmærksom på:
- reglerne for helligdage kan ændre sig over tid
- reglerne kan være forskellige for forskellige personer (funktionær, LO fabriks arbejder, butiks ansat etc.)

Et par af de værste er nok 1. maj og grundlovs dag.
Avatar billede claes57 Ekspert
30. januar 2011 - 20:27 #5
>#4
helligdage i dk er ens - uanset fagforening - noget andet er, om man i overenskomst har en fridag - men det har intet med helligdage at gøre (fx er 1. maj ikke en helligdag)
Avatar billede arne_v Ekspert
30. januar 2011 - 20:53 #6
Jo.

Men hvis vi nu antager at Lasse ikke arbejder for en kirke eller kirkeministeriet, så vil jeg tro at det er fridage han er interesseret i.
Avatar billede bvli Praktikant
30. januar 2011 - 21:12 #7
Hvis nu vi antager at Lasse ikke arbejder for en kirke eller kirkeministeriet - eller for den sags skyld bor i et land som har forskydelige helligdage i forhold til Kristi opstandelse, så har du ret.

Men så ville spørgsmålet vel have gået på, hvilke dage der var helligdage - i stedet for hvordan de blev beregnet? Hverken 1. maj eller grundlovsdag er f.eks. forskydelige og vil af den grund ikek skulle beregnes.

Jeg vil stadig påstå, at helligdage (i Danmark og andre kristne samfund) som er forskydelige, alle relaterer sig til påskesøndag.
Avatar billede bvli Praktikant
09. februar 2011 - 10:56 #8
Men du kunne ikke bruge det til noget Lasse?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester