В соответствии с официальным (григорианским) календарем , номер недели для 29.12.2008 равен 1, потому что после последнего дня недели 52 (т.е. 28/12) есть три или меньше дней осталось в году. Что-то странное, но хорошо, правила есть правила.
Таким образом, согласно этому календарю, у нас есть эти граничные значения для 2008/2009
- 28/12 - неделя 52
- 29/12 - неделя 1
- 1/1 - неделя 1
- 8/1 - неделя 2
C # предлагает класс GregorianCalendar, который имеет функцию GetWeekOfYear(date, rule, firstDayOfWeek)
.
Параметр rule
- это перечисление с тремя возможными значениями: 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 год.