1

我想计算一年中的周数。我看到这个帖子

在这篇文章中,接受的答案使用以下代码:

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 号,是正确的。但是在四月,C#如何使用一个月中总是6周来计算周数,四月的第一周没有四月的任何一天,因为所有的日子都属于三月,因为一周的最后一天是3月30日。所以 C# 说 4 月的第一周是第 15 周,但这是不正确的,它必须是第 14 周。

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

编辑:

我的意思是:

三月的最后一周是这样的:

25 26 27 28 29 30 31

这是第13个,是正确的。

四月的第一周是:

1 2 3 4 5 6 7

本周计算为第 15 周。

因此,如果我看到 3 月日历,最后一周计算为 13 日,如果我看到 4 月日历,则 3 月的最后一周计算为 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();  

谢谢。

4

1 回答 1

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);
于 2013-07-17T18:38:27.767 回答