2012-04-11 140 views
8

我有下面的代码获取的DateTime对象时周的C#日期时间

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

现在我给的日期1/1/2012至极应该返回1周函数给出了一年的weeknumber,但他回来了52周。我似乎无法弄清楚为什么。任何人有一个想法为什么?

+0

试用这个 'cal.GetWeekOfYear(date,CalendarWeekRule.FirstFourDayWeek,DayOfWeek.Sunday)' – Raghuveer 2012-04-11 09:14:28

+0

@RaghuveerGuthikonda:这只适用于这种特殊情况。例如, 2013年1月1日可能是一个星期六,它不会工作。这只是计算日历周的方式。 1/1/2012是在第52周,它应该在那里。 – basti 2012-04-12 07:28:35

回答

8

该算法完全按照您指示的方式执行。您将CalanderWeekRule设置为FirstFourDayWeek。 2012年1月1日不是头四周的一部分,所以你已经指示ca子从1月2日开始计算。

Calculate date from week number

0

我认为,既然1/1/2012是一个星期天和GetWeekOfYear说,它返回一个包含日期的一周,它的返回2011年的最后一个星期,而不是2012年

第一周

查看CalendarRule的说明。

0

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

1

周数正确计算。你应该阅读一下周末数是如何计算/计算的(维基百科?!)。

注意:周数计算的内置计算是错误的。微软在KnowledgeBase-Article 200299中描述了这个问题。 ISO-8601存在问题。

1

您可以使用类支持Time Period Library for .NET周支持ISO8601周编号:

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
public static int WeeksInYear(DateTime date) 
{ 
    GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized); 
    return cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Monday); 

我认为,如果改变CalendarWeekRule.FirstFourDayWeekCalendarWeekRule.FirstDay然后这将工作正常。

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