当前位置: 首页 > 编程语言 > C#

C#学习教程:.NET会为2008年12月29日给出错误的周数吗?Share

时间:2023-04-10 17:39:19 C#

.NET在2008年12月29日给出了错误的周数?根据官方(公历)日历,2008年12月29日是第1周,因为在第52周的最后一天(即28/12)之后,一年剩下三天或更少的日子。有点奇怪,但没关系,规则就是规则。所以根据这个日历我们有这些边界值2008/2009C#提供了一个GregorianCalendar类,它有一个函数GetWeekOfYear(date,rule,firstDayOfWeek)GetWeekOfYear(date,rule,firstDayOfWeek)。参数规则是一个具有3个可能值的枚举:FirstDay、FirstFourWeekDay、FirstFullWeek。据我了解,我应该有FirstFourWeekDay规则,但为了以防万一,我尝试了所有规则。最后一个参数通知应将哪个工作日视为一周的第一天,根据这个日历,这是星期一,所以它是星期一。所以我启动了一个快速但肮脏的控制台应用程序来测试它:usingSystem;使用System.Globalization;namespaceCalendarTest{classProgram{staticvoidMain(string[]args){varcal=newGregorianCalendar();varfirstWeekDay=DayOfWeek.Monday;vartwentyEighth=newDateTime(2008,12,28);vartwentyNinth=newDateTime(2008,12,29);varfirstJan=newDateTime(2009,1,1);日期时间(2009,1,8);PrintWeekDays(cal,twentyEighth,firstWeekDay);PrintWeekDays(cal,twentyNinth,firstWeekDay);PrintWeekDays(cal,firstJan,firstWeekDay);PrintWeekDays(cal,eightJan,firstWeekDay);;}privatestaticvoidPrintWeekDays(Calendarcal,DateTimedt,DayOfWeekfirstWeekDay){Console.WriteLine("Testingfor"+dt.ToShortDateString());Console.WriteLine("--------------------------------------------");Console.Write(CalendarWeekRule.FirstDay.ToString()+"tt");Console.WriteLine(cal.GetWeekOfYear(dt,CalendarWeekRule.FirstDay,firstWeekDay));缺点ole.Write(CalendarWeekRule.FirstFourDayWeek.ToString()+"t");Console.WriteLine(cal.GetWeekOfYear(dt,CalendarWeekRule.FirstFourDayWeek,firstWeekDay));Console.Write(CalendarWeekRule.FirstFullWeek.ToString()+"tt");Console.WriteLine(cal.GetWeekOfYear(dt,CalendarWeekRule.FirstFullWeek,firstWeekDay));Console.WriteLine("--------------------------------------------");}}}……这就是我得到的Testingfor28.12.2008----------------------------------------------FirstDay52FirstFourDayWeek52FirstFullWeek51--------------------------------------------2008年12月29日测试------------------------------------------第一天53FirstFourDayWeek53FirstFullWeek52------------------------------------------2009年1月1日测试------------------------------------------第一天1FirstFourDayWeek1FirstFullWeek52----------------------------------------08.01.2009测试--------------------------------------------杉木stDay2FirstFourDayWeek2FirstFullWeek1------------------------------------------因此,正如我们所看到的,上面的组合都不符合官方日历(如果你赶时间的话,只看到29/12永远不会进入第1周)我在这里做错了什么?也许我缺少一些明显的东西?(在比利时,这是周五和晚上的工作时间,所以请耐心等待;))编辑:也许我应该解释一下:我需要的是一个适用于任何年份并返回与我链接的公历相同结果的函数。因此没有针对2008的具体解决方法。本文深入探讨了问题和可能的解决方案。问题的核心是.NET日历实现似乎没有忠实地实现ISO标准@Conrad是正确的。DateTime和GregorianCalendar的.NET实现不实现/遵循完整的ISO8601规范。话虽如此,他们的规范非常详细且切中要害,至少在解析方面是这样。以下站点提供了更多信息:简而言之:一周由给定年份的周数决定,从星期一开始。一年的第一周是包含第一个星期四的那一周,或者等同于包含1月4日的星期四。以下是我用于正确处理ISO8601日期的代码的一部分:#regionFirstWeekOfYear//////获取一年的第一周。//////检索第一周的年份。///A表示一年中第一周的开始。//////根据定义,一年的第01周是今年的星期四///的第一周,相当于包含一月的第四天///的那一周。换句话说,新年的第一周是在新年中占大部分天数的一周///。第01周也可能///包含上一年的天数,而一年的第01周之前的一周///是上一年的最后一周(52或53),即使它包含新年的天数///.///一周从星期一(第1天)开始,到星期日(第7天)结束。///privatestaticDateTimeFirstWeekOfYear(intyear){intdayNumber;//获取表示给定年份的一月四日的日期。DateTimedate=newDateTime(年,1,4,0,0,0,DateTimeKind.Utc);//一周从星期一(第1天)开始,到星期日(第7天)结束。//由于DayOfWeek.Sunday=0,将其转换为7。所有其他值//因为DayOfWeek.Monday=1都是正确的。if(date.DayOfWeek==DayOfWeek.Sunday){dayNumber=7;}else{dayNumber=(int)date.DayOfWeek;}//因为一周是从星期一开始的,所以找出星期一落在哪一天。返回日期.AddDays(1-dayNumber);}#endregion#regionGetIsoDate//////获取指定.//////应该为其计算ISO日期///的。///代表ISO日期。privatestaticintGetIsoDate(DateTimedate){DateTimefirstWeek;intyear=date.Year;//如果接近年底,那么我们需要计算//明年的第一周应该是哪一周。if(date>=newDateTime(year,12,29)){if(date==DateTime.MaxValue){firstWeek=FirstWeekOfYear(year);}}else{firstWeek=FirstWeekOfYear(year+1);}//如果当前日期小于下一年的第一周,那么//我们仍处于当年的最后一个月;否则//更改为明年。if(date///获取此实例表示的日期的星期部分。//////星期,介于1和53之间。publicintWeek{get{returnthis.isoDate%100;}}#endregion#regionYear//////获取此实例表示的日期的年份部分。//////年份,介于1和9999之间。publicintYear{get{returnthis.isoDate/100;}}#endregion周数因国家/地区而异,如果我没有完全错的话,应该取决于您所在的地区/地区hopeoneisworth亲爱的框架服从你在本地运行时选择的国家。根据我的经验,表现出的行为是典型的,指的是第53周的部分最后一周。这可能是因为我对周数相关的所有重大风险到日历年末用于报告目的。美国国税局(或您选择的税务机构)认为日历年在12月31日结束,而不是一年的最后一周。我知道这是一篇旧文章,但无论如何nodatimes似乎都得到了正确的结果。作为一种解决方法,您可以说周数是WeekNumbermod52。我相信这适用于您描述的情况。作为解决方法,为什么不使用FirstFourDayWeek而添加:以上是C#学习教程:.NET在2008年12月29日给出了错误的周数?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——if(weekNumber>52)weekNumber=1;本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: