Mega Code Archive

 
Categories / C# / Date Time
 

Get the week number

//Octavalent Extension Methods //http://sdfasdf.codeplex.com/ //Library of extension methods for .Net create by Octavalent (www.octavalent.nl) using System; namespace System.OctavalentExtensions {     public static class DateTimeExtensions     {         #region Week         public static int GetWeekNumber(this DateTime date)         {             // Updated 2004.09.27. Cleaned the code and fixed abug. Compared the algorithm with             // code published here . Tested code successfully against the other algorithm              // for all dates in all years between 1900 and 2100.             // Thanks to Marcus Dahlberg for pointing out the deficient logic.             // Calculates the ISO 8601 Week Number             // In this scenario the first day of the week is monday,              // and the week rule states that:             // [...] the first calendar week of a year is the one              // that includes the first Thursday of that year and              // [...] the last calendar week of a calendar year is              // the week immediately preceding the first              // calendar week of the next year.             // The first week of the year may thus start in the              // preceding year             const int JAN = 1;             const int DEC = 12;             const int LASTDAYOFDEC = 31;             const int FIRSTDAYOFJAN = 1;             const int THURSDAY = 4;             bool ThursdayFlag = false;             // Get the day number since the beginning of the year             int DayOfYear = date.DayOfYear;             // Get the numeric weekday of the first day of the              // year (using sunday as FirstDay)             var StartWeekDayOfYear =                 (int) (new DateTime(date.Year, JAN, FIRSTDAYOFJAN)).DayOfWeek;             var EndWeekDayOfYear =                 (int) (new DateTime(date.Year, DEC, LASTDAYOFDEC)).DayOfWeek;             // Compensate for the fact that we are using monday             // as the first day of the week             if (StartWeekDayOfYear == 0)                 StartWeekDayOfYear = 7;             if (EndWeekDayOfYear == 0)                 EndWeekDayOfYear = 7;             // Calculate the number of days in the first and last week             int DaysInFirstWeek = 8 - (StartWeekDayOfYear);             // If the year either starts or ends on a thursday it will have a 53rd week             if (StartWeekDayOfYear == THURSDAY || EndWeekDayOfYear == THURSDAY)                 ThursdayFlag = true;             // We begin by calculating the number of FULL weeks between the start of the year and             // our date. The number is rounded up, so the smallest possible value is 0.             var FullWeeks = (int) Math.Ceiling((DayOfYear - (DaysInFirstWeek))/7.0);             int WeekNumber = FullWeeks;             // If the first week of the year has at least four days, then the actual week number for our date             // can be incremented by one.             if (DaysInFirstWeek >= THURSDAY)                 WeekNumber = WeekNumber + 1;             // If week number is larger than week 52 (and the year doesn't either start or end on a thursday)             // then the correct week number is 1.             if (WeekNumber > 52 && !ThursdayFlag)                 WeekNumber = 1;             // If week number is still 0, it means that we are trying to evaluate the week number for a             // week that belongs in the previous year (since that week has 3 days or less in our date's year).             // We therefore make a recursive call using the last day of the previous year.             if (WeekNumber == 0)                 WeekNumber = new DateTime(date.Year - 1, DEC, LASTDAYOFDEC).GetWeekNumber();             return WeekNumber;         }         #endregion     } }