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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

来自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);
}
提问于
用户回答回答于

.NET允许将数周划分为几年,而ISO标准则不允许。在本文中,还有一个简单的函数可以得到一年中最后一周的正确的ISO 8601周数。

更新下面的方法实际上返回12012-12-31这在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);
} 
用户回答回答于

一年可以有超过52周。每年有52周+1或+2(闰年)天。他们弥补了第53个星期。

  • 52周*7天=364天。

因此,每年你至少有一个额外的一天。闰年两次。这些额外的日子是否算为各自的一周?

到底有多少周取决于你一周的开始日期。让我们考虑一下这个2012。

  • 美国(星期日->星期六):52周+一周两天短的2012-12-30和2012-12-31.。结果总共需要53周。今年的最后两天(星期日+星期一)组成了他们自己的短短的一周。

检查当前文化的设置,看看它作为一周的第一天使用了什么。

正如你所看到的,结果得到53是正常的。

  • 欧洲(星期一->星期日):一月二日(2012-1-2)是第一个星期一,所以这是第一周的第一天。问问1月1日的周数,你就会得到52周,因为它被认为是2011周的一部分。

甚至有可能有第54周。每28年发生一次,1月1日和12月31日被视为单独的一周。这一定也是闰年。

例如,2000年有54周。1月1日为第一周,12月31日为第二周。

var d = new DateTime(2012, 12, 31);
CultureInfo cul = CultureInfo.CurrentCulture;

var firstDayWeek = cul.Calendar.GetWeekOfYear(
    d,
    CalendarWeekRule.FirstDay,
    DayOfWeek.Monday);

int weekNum = cul.Calendar.GetWeekOfYear(
    d,
    CalendarWeekRule.FirstDay,
    DayOfWeek.Monday);

int year = weekNum == 52 && d.Month == 1 ? d.Year - 1 : d.Year;
Console.WriteLine("Year: {0} Week: {1}", year, weekNum);

打印:年份:2012周:54

将上面示例中的Cal宪兵周刊规则更改为FirstFullWeek或FirstFourDayWeek,将得到53。既然我们是在和德国打交道,让我们把星期一作为开始的一天。

所以第53周从2012到12-31周一开始,持续一天,然后停止.

53是正确的答案。如果想尝试的话,就把文化换到德国。

CultureInfo cul = CultureInfo.GetCultureInfo("de-DE");

扫码关注云+社区