C# 中计算第几周的几种方法

来源:互联网 发布:xp保存网络密码 编辑:程序博客网 时间:2024/05/21 21:37

有时候在ERP中,会用到周期计算,甚至是以周期为条件的功能,我在公司就遇到了这种情况,很多事情都围绕着周期计算,将内容放入到周期中,直接上解决办法吧。

 

中国的日历与国际日历有所不同,中国万年历,是以星期一为开始,周日为结束,国际上是以周日开始,周六结束。


public static int Excute(DateTime dTime)
    {
        var dayOfYear = dTime.DayOfYear; //确定此时间在一年中的位置 
        var tempDate = new DateTime(dTime.Year, 1, 1);//当年第一天
        var tempDayOfWeek = (int)tempDate.DayOfWeek;//确定当年第一天
        tempDayOfWeek = tempDayOfWeek == 0 ? 7 : tempDayOfWeek;
        var index = (int)dTime.DayOfWeek;//确定星期几
        index = index == 0 ? 7 : index;
        DateTime retStartDay = dTime.AddDays(-(index - 1));//当前周的范围
        DateTime retEndDay = dTime.AddDays(7 - index);
        var weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek - 1) / 7);//确定当前是第几周 


        if (retStartDay.Year < retEndDay.Year)
        {
            weekIndex = 1;
        }




        return weekIndex;
    }

这种计算方式有一个局限,那就是当周期超过52周,以后,跨年的那几天,我是说下一年11日前几天又可能会被算作第一周。


后来我又发现了这种方式:

private static int GetWeekOfYear(DateTime dt)
        {
            GregorianCalendar gc = new GregorianCalendar();
            int weekOfYear = gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday);


            return weekOfYear;
        }

但是这种方式同样也是按中国的日期计算方式,当需要使用sql server 的函数DATEPART

筛选数据的时候,两个又矛盾了,下面才是终极解决方案:

public static int WeekOfYear(DateTime dt, CultureInfo ci)
        {
            return ci.Calendar.GetWeekOfYear(dt, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek);
        }


调用方法:WeekOfYear(DateTime.Now, new CultureInfo("zh-CN"));

0 0