Согласно по официальному (григорианскому) календарю номер недели на 29/12/2008 равен 1, потому что после последнего дня 52 недели (т.е. 28/12) в году осталось три или меньше дней. Немного странно, но ладно, правила есть правила.
Итак, согласно этому календарю, у нас есть эти граничные значения на 2008/2009 год.
- 28.12 это 52 неделя.
- 29.12 - первая неделя.
- 1/1 это неделя 1
- 8/1 это вторая неделя
C# предлагает класс GregorianCalendar с функцией GetWeekOfYear(date, rule, firstDayOfWeek)
.
Параметр rule
представляет собой перечисление с 3 возможными значениями: FirstDay, FirstFourWeekDay, FirstFullWeek
. Из того, что я понял, я должен использовать правило FirstFourWeekDay
, но на всякий случай я попробовал их все.
Последний параметр сообщает, какой день недели следует считать первым днем недели, в соответствии с этим календарем это понедельник, поэтому понедельник.
Поэтому я запустил быстрое и грязное консольное приложение, чтобы проверить это:
using System;
using System.Globalization;
namespace CalendarTest
{
class Program
{
static void Main(string[] args)
{
var cal = new GregorianCalendar();
var firstWeekDay = DayOfWeek.Monday;
var twentyEighth = new DateTime(2008, 12, 28);
var twentyNinth = new DateTime(2008, 12, 29);
var firstJan = new DateTime(2009, 1, 1);
var eightJan = new DateTime(2009, 1, 8);
PrintWeekDays(cal, twentyEighth, firstWeekDay);
PrintWeekDays(cal, twentyNinth, firstWeekDay);
PrintWeekDays(cal, firstJan, firstWeekDay);
PrintWeekDays(cal, eightJan, firstWeekDay);
Console.ReadKey();
}
private static void PrintWeekDays(Calendar cal, DateTime dt, DayOfWeek firstWeekDay)
{
Console.WriteLine("Testing for " + dt.ToShortDateString());
Console.WriteLine("--------------------------------------------");
Console.Write(CalendarWeekRule.FirstDay.ToString() + "\t\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, firstWeekDay));
Console.Write(CalendarWeekRule.FirstFourDayWeek.ToString() + "\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, firstWeekDay));
Console.Write(CalendarWeekRule.FirstFullWeek.ToString() + "\t\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, firstWeekDay));
Console.WriteLine("--------------------------------------------");
}
}
}
... и это то, что я получаю
Testing for 28.12.2008
--------------------------------------------
FirstDay 52
FirstFourDayWeek 52
FirstFullWeek 51
--------------------------------------------
Testing for 29.12.2008
--------------------------------------------
FirstDay 53
FirstFourDayWeek 53
FirstFullWeek 52
--------------------------------------------
Testing for 01.01.2009
--------------------------------------------
FirstDay 1
FirstFourDayWeek 1
FirstFullWeek 52
--------------------------------------------
Testing for 08.01.2009
--------------------------------------------
FirstDay 2
FirstFourDayWeek 2
FirstFullWeek 1
--------------------------------------------
Итак, как мы видим, ни одна из приведенных выше комбинаций не соответствует официальному календарю (если вы спешите, просто обратите внимание, что 29/12 никогда не получает неделю №1).
Что я здесь не так? Может быть, есть что-то вопиющее, что я упускаю? (Здесь, в Бельгии, пятница и поздний рабочий день, потерпите меня ;))
Редактировать: Может быть, мне следует объяснить: мне нужна функция, которая работает для любого года, возвращая те же результаты, что и григорианский календарь, который я связал. Так что никаких специальных обходных путей для 2008 года.