C#周日期

时间:2012-04-11 08:49:07

标签: c# windows datetime gregorian-calendar

我有以下代码来获取DateTime对象Time

中给出的年份的周数
    public static int WeeksInYear(DateTime date)
    {
        GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
        return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }

现在我给这个函数的日期是1/1/2012,它应该返回第1周,但是他回到第52周。我似乎无法弄清楚为什么。任何人都知道为什么?

6 个答案:

答案 0 :(得分:8)

该算法完全按照您的指示行事。你将CalanderWeekRule设置为FirstFourDayWeek。 2012年1月1日不是前四天的一部分,所以你已经指示压光器从1月2日开始计数。

Calculate date from week number

答案 1 :(得分:4)

public static int WeeksInYear(DateTime date)
{
    GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
    return cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

我认为如果将 CalendarWeekRule.FirstFourDayWeek 更改为 CalendarWeekRule.FirstDay ,那么这将正常工作。

我改变它然后它的工作正常。

答案 2 :(得分:1)

正确计算了周数。你应该读一下如何实际计算/计算周数(维基百科?!)。

注意:周数计算的内置计算是错误的。 Microsoft在KnowledgeBase-Article 200299中描述了该问题。它与ISO-8601有问题。

答案 3 :(得分:1)

您可以使用支持ISO 8601周编号的Time Period Library for .NET

TimeCalendar calendar = new TimeCalendar(
    new TimeCalendarConfig { YearWeekType = YearWeekType.Iso8601 } );
Week week = new Week( new DateTime( 2012, 01, 01 ), calendar );
Console.WriteLine( "week #: ", week.WeekOfYear );

答案 4 :(得分:0)

我认为因为2012年1月1日是星期日而GetWeekOfYear表示它返回包含日期的一周,所以它将返回2011年的最后一周,而不是2012年的第一周。

请查看CalendarRule以获得澄清。

答案 5 :(得分:0)

2012年1月1日这是星期天。我相信这就是为什么你得到52,因为这是去年一周的最后一天。在1月2日你应该得到正确的结果。