using System; using System.Globalization; using System.Runtime.InteropServices; namespace Masuit.Tools.DateTimeExt { /// /// 日期时间帮助类 /// public static class DateTimeHelper { /// /// 获取某一年有多少周 /// /// /// 年份 /// 该年周数 public static int GetWeekAmount(this DateTime _, int year) { var end = new DateTime(year, 12, 31); //该年最后一天 var gc = new GregorianCalendar(); return gc.GetWeekOfYear(end, CalendarWeekRule.FirstDay, DayOfWeek.Monday); //该年星期数 } /// /// 返回年度第几个星期 默认星期日是第一天 /// /// 时间 /// 第几周 public static int WeekOfYear(this DateTime date) { var gc = new GregorianCalendar(); return gc.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); } /// /// 返回年度第几个星期 /// /// 时间 /// 一周的开始日期 /// 第几周 public static int WeekOfYear(this DateTime date, DayOfWeek week) { var gc = new GregorianCalendar(); return gc.GetWeekOfYear(date, CalendarWeekRule.FirstDay, week); } /// /// 得到一年中的某周的起始日和截止日 /// 年 nYear /// 周数 nNumWeek /// 周始 out dtWeekStart /// 周终 out dtWeekeEnd /// /// /// 年份 /// 第几周 /// 开始日期 /// 结束日期 public static void GetWeekTime(this DateTime _, int nYear, int nNumWeek, out DateTime dtWeekStart, out DateTime dtWeekeEnd) { var dt = new DateTime(nYear, 1, 1); dt += new TimeSpan((nNumWeek - 1) * 7, 0, 0, 0); dtWeekStart = dt.AddDays(-(int)dt.DayOfWeek + (int)DayOfWeek.Monday); dtWeekeEnd = dt.AddDays((int)DayOfWeek.Saturday - (int)dt.DayOfWeek + 1); } /// /// 得到一年中的某周的起始日和截止日 周一到周五 工作日 /// /// /// 年份 /// 第几周 /// 开始日期 /// 结束日期 public static void GetWeekWorkTime(this DateTime _, int nYear, int nNumWeek, out DateTime dtWeekStart, out DateTime dtWeekeEnd) { var dt = new DateTime(nYear, 1, 1); dt += new TimeSpan((nNumWeek - 1) * 7, 0, 0, 0); dtWeekStart = dt.AddDays(-(int)dt.DayOfWeek + (int)DayOfWeek.Monday); dtWeekeEnd = dt.AddDays((int)DayOfWeek.Saturday - (int)dt.DayOfWeek + 1).AddDays(-2); } #region P/Invoke 设置本地时间 [DllImport("kernel32.dll")] private static extern bool SetLocalTime(ref SystemTime time); [StructLayout(LayoutKind.Sequential)] private struct SystemTime { public short year; public short month; public short dayOfWeek; public short day; public short hour; public short minute; public short second; public short milliseconds; } /// /// 设置本地计算机时间 /// /// DateTime对象 public static void SetLocalTime(this DateTime dt) { SystemTime st; st.year = (short)dt.Year; st.month = (short)dt.Month; st.dayOfWeek = (short)dt.DayOfWeek; st.day = (short)dt.Day; st.hour = (short)dt.Hour; st.minute = (short)dt.Minute; st.second = (short)dt.Second; st.milliseconds = (short)dt.Millisecond; SetLocalTime(ref st); } #endregion } }