获取给定日期的正确周数。

获取给定日期的正确周数。

我在谷歌上搜索了很多,找到了很多解决方案,但是没有一个给我正确的2012-12-31周数。甚至MSDN上的示例(链接)失败。

2012-12-31是星期一,所以应该是第一周,但是我尝试的每一种方法都给了我53。以下是我尝试过的一些方法:

来自MDSN库:

DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;Calendar cal = dfi.Calendar;return cal.GetWeekOfYear(date, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);

解决方案2:

return new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

解决方案3:

CultureInfo ciCurr = CultureInfo.CurrentCulture;int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);return weekNum;

更新

当日期为2012-12-31时,下面的方法实际上返回1。换句话说,我的问题是我的方法没有遵循ISO-8601标准。

// This presumes that weeks start with Monday.// Week 1 is the 1st week of the year with a Thursday in it.public static int GetIso8601WeekOfYear(DateTime time){
    // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
    // be the same week# as whatever Thursday, Friday or Saturday are,
    // and we always get those right
    DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    // Return the week of our adjusted day
    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);}


守着星空守着你
浏览 325回答 3
3回答

喵喔喔

一年可以超过52周。每年有52个完整的周+1或+2(闰年)天。他们弥补了第53个星期。52周*7天=364天。因此,每年你至少有一个额外的一天。闰年两次。这些额外的日子是否被算作他们自己的单独的一周?到底有多少周取决于你一周的开始日期。让我们考虑一下2012年的情况。美国(星期日->星期六):2012年-12-30和2012-12-31,每周52周+一周短2天.这总共需要53周的时间。今年的最后两天(星期日+星期一)组成了他们自己的短短的一周。检查当前文化的设置,看看它作为一周的第一天使用了什么。正如你所看到的,结果得到53是正常的。欧洲(星期一->星期日):1月2日(2012-1-2年)是第一个星期一,所以这是第一周的第一天。问问1月1日的周数,你就会得到52周,因为它被认为是2011年最后一周的一部分。甚至有可能有第54周。每28年发生一次,1月1日和12月31日被视为单独的一周。今年一定也是闰年。例如,2000年有54周。1月1日为第一周,12月31日为第二周。var&nbsp;d&nbsp;=&nbsp;new&nbsp;DateTime(2012,&nbsp;12,&nbsp;31);CultureInfo&nbsp;cul&nbsp;=&nbsp;CultureInfo.CurrentCulture;var&nbsp;firstDayWeek&nbsp;=&nbsp;cul.Calendar.GetWeekOfYear( &nbsp;&nbsp;&nbsp;&nbsp;d, &nbsp;&nbsp;&nbsp;&nbsp;CalendarWeekRule.FirstDay, &nbsp;&nbsp;&nbsp;&nbsp;DayOfWeek.Monday);int&nbsp;weekNum&nbsp;=&nbsp;cul.Calendar.GetWeekOfYear( &nbsp;&nbsp;&nbsp;&nbsp;d, &nbsp;&nbsp;&nbsp;&nbsp;CalendarWeekRule.FirstDay, &nbsp;&nbsp;&nbsp;&nbsp;DayOfWeek.Monday);int&nbsp;year&nbsp;=&nbsp;weekNum&nbsp;==&nbsp;52&nbsp;&&&nbsp;d.Month&nbsp;==&nbsp;1&nbsp;?&nbsp;d.Year&nbsp;-&nbsp;1&nbsp;:&nbsp;d.Year;Console.WriteLine("Year:&nbsp;{0}&nbsp;Week:&nbsp;{1}",&nbsp;year,&nbsp;weekNum);打印:年份:2012年周:54将上面示例中的CalportWeekRule更改为FirstFullWeek或FirstFourDayWeek,您将得到53。既然我们正在和德国打交道,让我们把开学日保持在星期一。因此,第53周从2012年至12月31日星期一开始,持续一天,然后停止。53是正确的答案。如果想尝试的话,就把文化换到德国。CultureInfo&nbsp;cul&nbsp;=&nbsp;CultureInfo.GetCultureInfo("de-DE");
打开App,查看更多内容
随时随地看视频慕课网APP