//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
}
}
|