根据official (gregorian) calendar,2008年12月29日的星期数是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是具有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永远不会成为第一周)。

    我这是怎么了?也许我缺少一些明显的东西? (现在是比利时的星期五和下类时间,请耐心等待;))

    编辑:也许我应该解释一下:我需要的是可以在任何年份使用的函数,返回的结果与我链接的公历相同。因此,2008年没有特殊的解决方法。

    最佳答案

    article对问题和可能的解决方法进行了更深入的研究。问题的关键在于.NET日历实现似乎并未如实实现ISO标准

    关于c# - .NET为我提供的2008年12月29日的星期数字错误吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/428957/

    10-11 22:53
    查看更多