gpt4 book ai didi

c# - .NET 是否为我提供了 2008 年 12 月 29 日的错误周数?

转载 作者:可可西里 更新时间:2023-11-01 07:54:19 25 4
gpt4 key购买 nike

根据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 永远不会成为第 1 周)。

我在这里弄错了什么?也许我缺少一些明显的东西? (现在是星期五,比利时这里的工作时间很晚,请耐心等待 ;))

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

最佳答案

article深入研究问题和可能的解决方法。问题的核心在于.NET 日历实现似乎并没有忠实地实现 ISO 标准

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com