using System;
|
using System.Collections.Generic;
|
using System.Globalization;
|
using System.Linq;
|
using System.Web;
|
|
namespace WebAPI.Models
|
{
|
public class GetWeekList
|
{
|
|
#region 根据时间获取当前是第几周
|
|
//如果12月31号与下一年的1月1好在同一个星期则算下一年的第一周
|
public int GetWeekIndex(DateTime dTime)
|
{
|
try
|
{
|
//确定此时间在一年中的位置(第多少天)
|
int dayOfYear = dTime.DayOfYear;
|
|
//当年第一天
|
DateTime tempDate = new DateTime(dTime.Year, 1, 1);
|
//确定当年第一天是周几
|
int tempDayOfWeek = (int)tempDate.DayOfWeek;
|
//判断当前一月一号如果是周日(0),则默认为周一
|
tempDayOfWeek = tempDayOfWeek == 0 ? 1 : tempDayOfWeek;
|
|
//确定当前日期是星期几
|
int index = (int)dTime.DayOfWeek;
|
//判断当前日期如果是周日(0),则默认为周一
|
index = index == 0 ? 1 : index;
|
|
//当前日期周的范围
|
DateTime retStartDay = dTime.AddDays(-(index - 1));
|
DateTime retEndDay = dTime.AddDays(7 - index);
|
|
//确定当前日期是第几周
|
int weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek - 1) / 7);
|
|
//对比当前日期周的开始和结束,判定是否跨年第一周
|
if (retStartDay.Year < retEndDay.Year)
|
{
|
weekIndex = 1;
|
}
|
|
return weekIndex;
|
}
|
catch (Exception ex)
|
{
|
throw new Exception(ex.Message);
|
}
|
//string retVal = retStartDay.ToString("yyyy/MM/dd") + "~" + retEndDay.ToString("yyyy/MM/dd");
|
|
}
|
public int GetWeekIndex(string strDate)
|
{
|
try
|
{
|
//需要判断的时间
|
DateTime dTime = Convert.ToDateTime(strDate);
|
return GetWeekIndex(dTime);
|
}
|
catch (Exception ex)
|
{
|
throw new Exception(ex.Message);
|
}
|
|
}
|
#endregion
|
|
#region 以周末为每周第一天来计算当前日期所属哪一年第几周
|
public string getWeek(DateTime dtime)
|
{
|
int nowweekindex = 0;
|
//定义每周第一天为周末开始
|
int[] aweek = new int[] { 0, 1, 2, 3, 4, 5, 6 };
|
int weekd = 0;
|
string yearmonthweek = "";
|
//确定此时间在一年中的位置(第多少天)
|
int dayofyear = dtime.DayOfYear;
|
//确定此时间在一年中的月份
|
int dayofmonth = dtime.Month;
|
//确定当年第一天是周几
|
//int dayofweek = (int)dtime.DayOfWeek;
|
//当年第一天
|
DateTime dtfirstday = new DateTime(dtime.Year, 1, 1);
|
//确定当年第一天是周几
|
int dtfirstdayofweek = (int)dtfirstday.DayOfWeek;
|
//DateTime dtlastday = new DateTime(dtime.Year, 12, 31);
|
//下一年第一天
|
DateTime dtnextyear = new DateTime(dtime.Year + 1, 1, 1);
|
//int dtnextyeardayofweek = (int)dtnextyear.DayOfWeek;
|
//下一年第一天是周几
|
int nextyear = sy(dtnextyear,aweek) - 1;
|
DateTime dtlastday1 = new DateTime(dtime.Year, 12, 31 - nextyear);
|
if ((int)dtime.DayOfYear - (int)dtfirstday.DayOfYear <= 7 - sy(dtfirstday,aweek))
|
{
|
nowweekindex = 1;
|
yearmonthweek = dtime.Year + "_" + dayofmonth + "_" + nowweekindex;
|
}
|
else if ((int)dtime.DayOfYear <= (int)dtlastday1.DayOfYear)
|
{
|
for (int j = 0; j < aweek.Length; j++)
|
{
|
if (Convert.ToInt32(aweek[j]) == dtfirstdayofweek)
|
{
|
int b = aweek.Length - (j + 1);
|
int x = (dayofyear - 1) - b;
|
weekd = x / 7;
|
int yushu = x % 7;
|
if (yushu != 0)
|
{
|
nowweekindex = weekd + 2;
|
yearmonthweek = dtime.Year + "_" + dayofmonth + "_" + nowweekindex;
|
}
|
else
|
{
|
nowweekindex = weekd + 1;
|
yearmonthweek = dtime.Year + "_" + dayofmonth + "_" + nowweekindex;
|
}
|
}
|
}
|
}
|
else
|
{
|
nowweekindex = weekd + 1;
|
yearmonthweek = dtime.Year + 1 + "_" + 1 + "_" + nowweekindex;
|
}
|
return yearmonthweek;
|
}
|
|
|
public static int sy(DateTime dtime, int[] aweek)
|
{
|
int midnum = 0;
|
int midof = (int)dtime.DayOfWeek;
|
for (int i = 0; i < aweek.Length; i++)
|
{
|
if (Convert.ToInt32(aweek[i]) == midof)
|
{
|
midnum = i;
|
}
|
}
|
return midnum + 1;
|
}
|
#endregion
|
|
public string GetCodeDateStr(DateTime dtime)
|
{
|
DateTime currentTime = dtime;
|
var year = GetOfYear(currentTime);
|
var week = GetWeekOfYear(currentTime);
|
var weekStr = week < 10 ? $"0{week}" : week.ToString();
|
var dateStr = $"{year}{weekStr}{getWeekOfDay(dtime)}"; ;
|
return dateStr;
|
}
|
private static int GetOfYear(DateTime dt)
|
{
|
var OfYear =int.Parse(dt.Year.ToString().ToCharArray()[3].ToString());
|
GregorianCalendar gc = new GregorianCalendar();
|
//判断当前日期是否是12月份
|
int dayofmonth = dt.Month;
|
//判断当前日期是第几周
|
int dayofweek = gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
|
//下一年的第一天
|
DateTime dtfirstday = new DateTime(dt.Year + 1, 1, 1);
|
//确定下一年第一天是周几
|
int dtfirstdayofweek = (int)dtfirstday.DayOfWeek;
|
//判断下一年第一天不为周日且当前日期为本年第12月且当前日期为本年第53周
|
if (dtfirstdayofweek != 0 && dayofmonth == 12 && dayofweek == 53)
|
{
|
OfYear = OfYear + 1; //加一年
|
}
|
else
|
{
|
OfYear = int.Parse(dt.Year.ToString().ToCharArray()[3].ToString());
|
}
|
return OfYear;
|
}
|
private static int GetWeekOfYear(DateTime dt)
|
{
|
int weekOfYear = 1;
|
GregorianCalendar gc = new GregorianCalendar();
|
//判断当前日期是否是12月份
|
int dayofmonth = dt.Month;
|
//判断当前日期是第几周
|
int dayofweek=gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
|
//下一年的第一天
|
DateTime dtfirstday = new DateTime(dt.Year+1, 1, 1);
|
//确定下一年第一天是周几
|
int dtfirstdayofweek = (int)dtfirstday.DayOfWeek;
|
//判断下一年第一天不为周日且当前日期为本年第12月且当前日期为本年第53周
|
if (dtfirstdayofweek != 0&& dayofmonth == 12&&dayofweek ==53)
|
{
|
weekOfYear = 1; //下一年第一周
|
}
|
else
|
{
|
weekOfYear = gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
|
}
|
return weekOfYear;
|
}
|
public static int getWeekOfDay(DateTime dtime)
|
{
|
int DayinWeek = 0;
|
string week = dtime.DayOfWeek.ToString();
|
switch (week)
|
{
|
case "Monday":
|
DayinWeek = 2;
|
break;
|
case "Tuesday":
|
DayinWeek = 3;
|
break;
|
case "Wednesday":
|
DayinWeek = 4;
|
break;
|
case "Thursday":
|
DayinWeek = 5;
|
break;
|
case "Friday":
|
DayinWeek = 6;
|
break;
|
case "Saturday":
|
DayinWeek = 7;
|
break;
|
case "Sunday":
|
DayinWeek = 1;
|
break;
|
}
|
return DayinWeek;
|
}
|
}
|
}
|