Quantcast

Working with Weeks in C# (Not That Obvious)

Get the WebProNews Newsletter:


[ Business]

For some reason, Microsoft didn’t add a Week property to the DateTime class. I never could figure out why.

Instead they gave us the System.Globalization namespace, filled with date related functionality like the different calendar classes. In this example, I’m going to use the GregorianCalendar class to find the week number of a certain date.

using System.Globalization;

public static int WeekNumber(DateTime date)
{
   GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
   return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

As you can see, it’s not that difficult as long as you know where to look.

You can also check for the total number of weeks in a certain year. You would have to know the last day of the year, that never can be part of the first week of the following year. That day is december 28th. Here is a method that gives you the number of weeks in a specified year.

using System.Globalization;

public static int WeeksInYear(int year)
{
   GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
   return cal.GetWeekOfYear(new DateTime(year, 12, 28), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

Now for the tricky part. Let’s say you want to know the number of weeks between two dates. Just pass the two dates into the above method and subtract them from each other like “WeekNumber(dateFrom) – WeekNumber(dateTo) + 1″. Wrong! If the first date is from another year than the second one, it will not work.

In order to write a method that takes two dates and return the number of weeks in between them, you need some smart logic to make it work. Here’s is a method that I use for this purpose. It’s simple to use, but a little too complex for such a simple task, which I think should have been a part of the DateTime class to begin with.

public static int NumberOfWeeks(DateTime dateFrom, DateTime dateTo)
{
   TimeSpan Span = dateTo.Subtract(dateFrom);

   if (Span.Days <= 7)
   {
     if (dateFrom.DayOfWeek > dateTo.DayOfWeek)
     {
      return 2;
     }

     return 1;
   }

   int Days = Span.Days - 7 + (int)dateFrom.DayOfWeek;
   int WeekCount = 1;
   int DayCount = 0;

   for (WeekCount = 1; DayCount < Days; WeekCount++)
   {
     DayCount += 7;
   }

   return WeekCount;
}

As you can see from these code examples, working with weeks in C# is not that obvious.

Comments

Tag:

Add to Del.icio.us | Reddit | Furl

Bookmark WebProNews:

Mads Kristensen currently works as a Senior Developer at Traceworks located
in Copenhagen, Denmark. Mads graduated from Copenhagen Technical Academy with a multimedia degree in
2003, but has been a professional developer since 2000. His main focus is on ASP.NET but is responsible for Winforms, Windows- and
web services in his daily work as well. A true .NET developer with great passion for the simple solution.

http://www.madskristensen.dk/

Working with Weeks in C# (Not That Obvious)
About Mads Kristensen
Mads Kristensen currently works as a Senior Developer at Traceworks located in Copenhagen, Denmark. Mads graduated from Copenhagen Technical Academy with a multimedia degree in 2003, but has been a professional developer since 2000. His main focus is on ASP.NET but is responsible for Winforms, Windows- and web services in his daily work as well. A true .NET developer with great passion for the simple solution.

http://www.madskristensen.dk/ WebProNews Writer
Top Rated White Papers and Resources
  • Cato

    Bacause you hard-code the culture specific rules for week-number calculations in your call to GetWeekOfYear it will not work for all users

  • Join for Access to Our Exclusive Web Tools
  • Sidebar Top
  • Sidebar Middle
  • Sign Up For The Free Newsletter
  • Sidebar Bottom