有时候在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周,以后,跨年的那几天,我是说下一年1月1日前几天又可能会被算作第一周。
后来我又发现了这种方式:
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"));