1:第一种逻辑计算某天是这年中的第几周,别且当这天是年初且他所在周数是中的某天是属于上一天的,那么就把这天归属为上一年最后一周。
代码如下:
public int GetDayWeekOfYear(DateTime time)
{
DateTime firstDate = new DateTime(time.Year, 1, 1);
int FirstIntervalDayOfYear = GetFirstIntervalDayOfYear(firstDate);
int currentDays = Convert.ToInt32(time.DayOfYear)-FirstIntervalDayOfYear;
int n = currentDays/ 7+1;
if (currentDays % 7== 0)
n=n - 1;
if (currentDays < 1 ) //当currentDays < 1说明所选日期在这年第几天还不够这年中头几天在上一年第一周的年数,说明这周是属于上一年最后一周的
{
n = GetDayWeekOfYear(new DateTime(time.Year - 1, 12, 31));
}
return n;
}
public int GetFirstIntervalDayOfYear(DateTime date) //取这年中头几天是和上一年同在一个星期内的。
{
if ((int)date.DayOfWeek != 1)
{
return (8 - (int)date.DayOfWeek)%7;
}
return 0;
}
2:第二种逻辑在跨年的周里面,看那年占的天数多,就归属到那一年所以2012-12-31日在那周只占用2012年的一天,但是2013年占六天,所以这周应该都归属到2013年,包括2012-12-31这天
代码如下:
#region YearNum
private int m_YearNum = 0;
/// <summary>
/// 记录etd改变计算的year值
/// </summary>
public int YearNum
{
get
{
return this.m_YearNum;
}
set
{
this.m_YearNum = value;
}
}
#endregion
#region GetDefaultWeek
public int GetDefaultWeek(DateTime date)
{
int days = date.DayOfYear;
int baseWeek = days / 7 + 1;
int extradays = days % 7;
if (extradays == 0)
{
baseWeek--;
extradays += 7;
}
if (extradays - this.GetDayOfWeekCount(date.DayOfWeek) > 0)
{
baseWeek++;
}
if (date.Year > 2009)
{
int cell = this.CheckFirstDayOfYear(date);
int lastcell=this.CheckLastDayOfYear(date);
DateTime lastday=new DateTime (date.Year,12,31);
int yearDays=lastday.DayOfYear;
baseWeek = baseWeek + cell;
if (baseWeek == 0)
{
this.m_YearNum = date.Year - 1;
baseWeek = this.GetDefaultWeek(Convert.ToDateTime((date.Year - 1).ToString() + "-12-31"));
}
#region
else if(lastcell!=0&&days>(yearDays-lastcell))
{
this.m_YearNum = date.Year + 1;
baseWeek = this.GetDefaultWeek(Convert.ToDateTime((date.Year + 1).ToString() + "-1-1"));
}
#endregion
else
{
this.m_YearNum = date.Year;
}
}
return baseWeek;
}
#endregion
#region GetDayOfWeekCount
public int GetDayOfWeekCount(System.DayOfWeek dayOfWeek)
{
if (dayOfWeek == System.DayOfWeek.Sunday) return 7;
return (int)dayOfWeek;
}
#endregion
#region CheckFirstDayOfYear
private int CheckFirstDayOfYear(DateTime date)
{
int cell = 0;
string year = date.Year.ToString();
DateTime FirstDate = Convert.ToDateTime(year + "-01-01");
if ((int)FirstDate.DayOfWeek > 4 || (int)FirstDate.DayOfWeek==0)
{
cell = -1;
}
return cell;
}
#endregion
#region CheckLastDayOfYear
private int CheckLastDayOfYear(DateTime date)
{
int cell = 0;
string year = date.Year.ToString();
DateTime LastDate = Convert.ToDateTime(year + "-12-31");
if ((int)LastDate.DayOfWeek < 4 && (int)LastDate.DayOfWeek!=0)
{
cell = (int)LastDate.DayOfWeek;
}
return cell;
}
#endregion
//注解表达能力比较差 呵呵。