Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I calculate/find the week-number of a given date?

Tags:

date

c#

asp.net

How can I calculate/find the week-number of a given date?

like image 608
cllpse Avatar asked Sep 30 '09 11:09

cllpse


2 Answers

var currentCulture = CultureInfo.CurrentCulture; var weekNo = currentCulture.Calendar.GetWeekOfYear(                 new DateTime(2013, 12, 31),                 currentCulture.DateTimeFormat.CalendarWeekRule,                 currentCulture.DateTimeFormat.FirstDayOfWeek); 

Be aware that this is not ISO 8601 compatible. In Sweden we use ISO 8601 week numbers but even though the culture is set to "sv-SE", CalendarWeekRule is FirstFourDayWeek, and FirstDayOfWeek is Monday the weekNo variable will be set to 53 instead of the correct 1 in the above code.

I have only tried this with Swedish settings but I'm pretty sure that all countries (Austria, Germany, Switzerland and more) using ISO 8601 week numbers will be affected by this problem.

Peter van Ooijen and Shawn Steele has different solutions to this problem.

Here's a compact solution

private static int WeekOfYearISO8601(DateTime date) {     var day = (int)CultureInfo.CurrentCulture.Calendar.GetDayOfWeek(date);     return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date.AddDays(4 - (day == 0 ? 7 : day)), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); } 

It's been tested for the following dates

var datesAndISO8601Weeks = new Dictionary<DateTime, int>                         {                             {new DateTime(2000, 12, 31), 52},                             {new DateTime(2001, 1, 1), 1},                             {new DateTime(2005, 1, 1), 53},                             {new DateTime(2007, 12, 31), 1},                             {new DateTime(2008, 12, 29), 1},                             {new DateTime(2010, 1, 3), 53},                             {new DateTime(2011, 12, 31), 52},                             {new DateTime(2012, 1, 1), 52},                             {new DateTime(2013, 1, 2), 1},                             {new DateTime(2013, 12, 31), 1},                         };  foreach (var dateWeek in datesAndISO8601Weeks) {     Debug.Assert(WeekOfYearISO8601(dateWeek.Key) == dateWeek.Value, dateWeek.Key.ToShortDateString() + " should be week number " + dateWeek.Value + " but was " + WeekOfYearISO8601(dateWeek.Key)); } 
like image 61
Jonas Elfström Avatar answered Sep 23 '22 08:09

Jonas Elfström


  public static int GetWeekNumber(DateTime dtPassed)   {           CultureInfo ciCurr = CultureInfo.CurrentCulture;           int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);           return weekNum;   } 
like image 35
Andriy Tkach Avatar answered Sep 23 '22 08:09

Andriy Tkach