在.net项目中,对DateTime的相关操作使用的比较多,例如时间格式的转换,时间间隔的计算,时间所属的区间计算等,在这些要求中,虽然使用起来较为的简单,但是在转换的过程中,较为容易出错,花费的时间也较多,现在总结一些常用的时间操作方法,以便在项目开发中节省时间。

一下代码中需要使用到如下的实体类:

///<summary>///周(星期)信息实体类///</summary>[Serializable]publicclassWeekInfo{///<summary>///周(星期)信息实体类///</summary>publicWeekInfo(){Number=0;BeginDate=DateTime.MinValue;EndDate=DateTime.MaxValue;}///<summary>///周数///</summary>publicintNumber{get;set;}///<summary>///开始时间///</summary>publicDateTimeBeginDate{get;set;}///<summary>///结束时间///</summary>publicDateTimeEndDate{get;set;}///<summary>///输出第几周和日期间隔///<para>默认格式:</para>///<para>第几周,从2012年12月21日至2112年12月21日。</para>///</summary>///<returns>第几周和日期间隔</returns>publicoverridestringToString(){returnstring.Format("第{0}周,从{1}至{2}。",Number,BeginDate.ToString("yyyy年MM月dd日"),EndDate.ToString("yyyy年MM月dd日"));}///<summary>///输出第几周///</summary>///<paramname="isFill">少于2位时是否补零</param>///<returns>第几周</returns>publicstringGetWeekString(boolisFill){stringformat="第{0}周";if(isFill&&Number<10)format="第0{0}周";returnstring.Format(format,Number);}///<summary>///输出日期间隔///</summary>///<paramname="inputString">输出格式化字符串</param>///<paramname="dateString">日期格式化字符串</param>///<returns>日期间隔</returns>publicstringGetDateString(stringinputString,stringdateString){if(string.IsNullOrWhiteSpace(inputString)||string.IsNullOrWhiteSpace(dateString))returnnull;try{returnstring.Format(inputString,BeginDate.ToString(dateString),EndDate.ToString(dateString));}catch(Exceptionex){returnex.Message;}}}

1.获得年度第一个周一的日期:

///<summary>///获得年度第一个周一的日期///</summary>///<paramname="year">需要计算的年份</param>///<paramname="jumpYear">年度第一周是否跳过跨年的周数</param>///<paramname="offset">年度第一个周一偏移量</param>///<returns>年度第一个周一的日期</returns>publicstaticDateTimeWeekOfFirstDay(intyear,booljumpYear,outintoffset){varfirstDate=YearOfFirstDay(year);//该年的第一天varfirstWeek=(int)firstDate.DayOfWeek;//该年的第一天是周几offset=0;//周一偏移量switch(firstWeek){case1://星期一offset=0;break;case2://星期二offset=jumpYear?6:-1;break;case3://星期三offset=jumpYear?5:-2;break;case4://星期四offset=jumpYear?4:-3;break;case5://星期五offset=jumpYear?3:-4;break;case6://星期六offset=jumpYear?2:-5;break;case0://星期日offset=jumpYear?1:-6;break;}firstDate=firstDate.AddDays(offset);returnfirstDate;}

2.获得年度周(星期)信息实体集合列表:

///<summary>///获得年度周(星期)信息实体集合列表///</summary>///<paramname="year">需要计算的年份</param>///<paramname="jumpYear">年度第一周是否跳过跨年的周数</param>///<returns>周(星期)信息实体集合列表对象</returns>publicstaticIList<WeekInfo>WeekOfList(intyear,booljumpYear){IList<WeekInfo>weekList=newList<WeekInfo>();if(year<=0001||year>=9999)returnweekList;varoffset=0;varfirstDate=WeekOfFirstDay(year,jumpYear,outoffset);//年度周一的日期varindex=1;while(true){if(index>54)break;varweekInfo=newWeekInfo{Number=index,BeginDate=firstDate,EndDate=firstDate.AddDays(6)};weekList.Add(weekInfo);firstDate=firstDate.AddDays(7);//下周if(jumpYear){if(firstDate.Year!=year)break;}else{if(firstDate.AddDays(6).Year!=year)break;}index++;}returnweekList;}

3.获得某年第某周的开始日期和结束日期:

///<summary>///获得某年第某周的开始日期和结束日期///</summary>///<paramname="year">需要计算的年份</param>///<paramname="weekNumber">需要计算的周数</param>///<paramname="jumpYear">年度第一周是否跳过跨年的周数</param>///<paramname="weekBeginDate">开始日期</param>///<paramname="weekEndDate">结束日期</param>publicstaticvoidWeekOfDate(intyear,intweekNumber,booljumpYear,outDateTimeweekBeginDate,outDateTimeweekEndDate){weekBeginDate=DateTime.MinValue;weekEndDate=DateTime.MaxValue;if(year<=0001||year>=9999||weekNumber<1||weekNumber>54)return;intoffset;varfirstDate=WeekOfFirstDay(year,jumpYear,outoffset);//年度周一的日期firstDate=firstDate.AddDays((weekNumber-1)*7);weekBeginDate=firstDate;weekEndDate=firstDate.AddDays(6);}

4.获得某个日期属于某年的第几周:

///<summary>///获得某个日期属于某年的第几周///</summary>///<paramname="currentDate">需要计算的日期</param>///<paramname="jumpYear">年度第一周是否跳过跨年的周数</param>///<returns>某年的第几周</returns>publicstaticintWeekOfCurrent(DateTimecurrentDate,booljumpYear){if(DateTime.MinValue==currentDate||DateTime.MaxValue==currentDate)return0;intresult,offset;varfirstDate=WeekOfFirstDay(currentDate.Year,jumpYear,outoffset);//年度周一的日期varfirstWeek=(int)firstDate.DayOfWeek;//该年的第一天是周几varcurrentDay=currentDate.DayOfYear;if(offset>0){currentDay+=offset;}else{currentDay-=offset;}varremainderDay=currentDay-(7-firstWeek);if(remainderDay<1){result=1;}else{result=remainderDay/7;if(remainderDay%7!=0)result++;result++;}returnresult;}

5.统计一段时间内有多少个星期几:

///<summary>///统计一段时间内有多少个星期几///</summary>///<paramname="beginDate">开始日期</param>///<paramname="endDate">结束日期</param>///<paramname="weekNumber">星期几</param>///<returns>多少个星期几</returns>publicstaticintWeekOfTotalWeeks(DateTimebeginDate,DateTimeendDate,DayOfWeekweekNumber){vardayTotal=newTimeSpan(endDate.Ticks-beginDate.Ticks);varresult=(int)dayTotal.TotalDays/7;variLen=dayTotal.TotalDays%7;for(vari=0;i<=iLen;i++){if(beginDate.AddDays(i).DayOfWeek!=weekNumber)continue;result++;break;}returnresult;}

6.计算当前月属于第几季度:

///<summary>///计算当前月属于第几季度///</summary>///<returns>当前年第几季度</returns>publicstaticintQuarterOfCurrent(){returnQuarterOfCurrent(DateTime.Now.Month);}///<summary>///计算某个月属于第几季度///</summary>///<paramname="month">需要计算的月份</param>///<returns>某年第几季度</returns>publicstaticintQuarterOfCurrent(intmonth){if(month<1||month>12)return-1;return(month-1)/3+1;}