如何计算一年中的周数?

时间:2013-07-17 18:08:23

标签: c#-4.0 calendar

我想计算一年中一周的数量。 I see this post

在这篇文章中,使用此代码的是

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);
}

但是我看到了一个问题。如果一个月的最后一天是星期日,则重复一周的数量。

例如,2013年3月的最后一天是星期日。本周是第13位,是正确的。但是在4月份,C#如何使用一个月内总共6个星期来计算星期数,4月的第一周没有任何一天的四月,因为所有的日子都属于游行,因为一周的最后一天是3月30日。所以C#说四月的第一周是第15周,但这是不正确的,它必须是第14周。

所以我想知道是否有办法以正确的方式计算一周的数量。

编辑:

我的意思是:

三月,最后一周就是:

25 26 27 28 29 30 31

这是第13个,是正确的。

在四月,第一周是:

1 2 3 4 5 6 7

本周计算为第15位。

因此,如果我看到行军日历,则上周计算为第13日,如果我看到4月日历,则行军的最后一周计算为第14周。这是不正确的。

解决方案:

DateTime dtCalendar = Calendar.DisplayDate;
int gridRow = (int)GetValue(Grid.RowProperty);

// Return the week of our adjusted day
int wueekNumber= System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(dtCalendar, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);

if (dtCalendar.DayOfWeek == DayOfWeek.Monday)
{
    gridRow = gridRow - 1;
}

Text = (weekNumbe r+ gridRow - 1).ToString();  

感谢。

1 个答案:

答案 0 :(得分:1)

问题是您使用的是错误的CalendarWeekRule。要获得您想要的结果,您应该使用FirstDay。我在互联网上看到过各种代码,说你应该使用FirstFourDayWeek,但经过一些测试,我意识到“正确的”是FirstDay。我已经用你的例子对它进行了测试,它提供了正确的结果:第14周。

int targetYear = 2013;
DateTime targetDate = new DateTime(targetYear, 4, 1);
int week = System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(targetDate, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);