пятница, 4 марта 2011 г.

Getting the first day in a week with C#


I recently found myself having a DateTime value and needing to calculate the date of the first day in the week that my known date was in using C#. While this is one of those things that are pretty simple to do once you know the solution it did take me a couple of hours to get it right. It turns out that something as simple as calculating a the first day of a week is trickier than one might expect, at least if we want a solution that works for all cultures.
My first instinct was to calculate the first day of a week by subtracting dayInWeek.DayOfWeek - firstDayInWeek days from dayInWeek where dayInWeek is a DateTime specifying a date in the week. That worked fine as long as I did the calculations in an environment where the culture was English, where the first day of the week is Sunday which is enumerated as 0 in DayOfWeek (against international standards which says the first day of the week is monday). As I shifted to using a Swedish culture it broke down and I had to find a better solution.
Heres what I finally came up with:
01.using System;
02.using System.Globalization;
03. 
04.public static class FirstDayOfWeekUtility
05.{
06.///
07./// Returns the first day of the week that the specified
08./// date is in using the current culture.
09.///
10.public static DateTime GetFirstDayOfWeek(DateTime dayInWeek)
11.{
12.CultureInfo defaultCultureInfo = CultureInfo.CurrentCulture;
13.return GetFirstDateOfWeek(dayInWeek, defaultCultureInfo);
14.}
15. 
16.///
17./// Returns the first day of the week that the specified date
18./// is in.
19.///
20.public static DateTime GetFirstDayOfWeek(DateTime dayInWeek, CultureInfo cultureInfo)
21.{
22.DayOfWeek firstDay = cultureInfo.DateTimeFormat.FirstDayOfWeek;
23.DateTime firstDayInWeek = dayInWeek.Date;
24.while (firstDayInWeek.DayOfWeek != firstDay)
25.firstDayInWeek = firstDayInWeek.AddDays(-1);
26. 
27.return firstDayInWeek;
28.}
29.}


Комментариев нет: