DateTimeHelper.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using System;
  2. using System.Globalization;
  3. using System.Runtime.InteropServices;
  4. namespace Masuit.Tools.DateTimeExt
  5. {
  6. /// <summary>
  7. /// 日期时间帮助类
  8. /// </summary>
  9. public static class DateTimeHelper
  10. {
  11. /// <summary>
  12. /// 获取某一年有多少周
  13. /// </summary>
  14. /// <param name="_"></param>
  15. /// <param name="year">年份</param>
  16. /// <returns>该年周数</returns>
  17. public static int GetWeekAmount(this DateTime _, int year)
  18. {
  19. var end = new DateTime(year, 12, 31); //该年最后一天
  20. var gc = new GregorianCalendar();
  21. return gc.GetWeekOfYear(end, CalendarWeekRule.FirstDay, DayOfWeek.Monday); //该年星期数
  22. }
  23. /// <summary>
  24. /// 返回年度第几个星期 默认星期日是第一天
  25. /// </summary>
  26. /// <param name="date">时间</param>
  27. /// <returns>第几周</returns>
  28. public static int WeekOfYear(this DateTime date)
  29. {
  30. var gc = new GregorianCalendar();
  31. return gc.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
  32. }
  33. /// <summary>
  34. /// 返回年度第几个星期
  35. /// </summary>
  36. /// <param name="date">时间</param>
  37. /// <param name="week">一周的开始日期</param>
  38. /// <returns>第几周</returns>
  39. public static int WeekOfYear(this DateTime date, DayOfWeek week)
  40. {
  41. var gc = new GregorianCalendar();
  42. return gc.GetWeekOfYear(date, CalendarWeekRule.FirstDay, week);
  43. }
  44. /// <summary>
  45. /// 得到一年中的某周的起始日和截止日
  46. /// 年 nYear
  47. /// 周数 nNumWeek
  48. /// 周始 out dtWeekStart
  49. /// 周终 out dtWeekeEnd
  50. /// </summary>
  51. /// <param name="_"></param>
  52. /// <param name="nYear">年份</param>
  53. /// <param name="nNumWeek">第几周</param>
  54. /// <param name="dtWeekStart">开始日期</param>
  55. /// <param name="dtWeekeEnd">结束日期</param>
  56. public static void GetWeekTime(this DateTime _, int nYear, int nNumWeek, out DateTime dtWeekStart, out DateTime dtWeekeEnd)
  57. {
  58. var dt = new DateTime(nYear, 1, 1);
  59. dt += new TimeSpan((nNumWeek - 1) * 7, 0, 0, 0);
  60. dtWeekStart = dt.AddDays(-(int)dt.DayOfWeek + (int)DayOfWeek.Monday);
  61. dtWeekeEnd = dt.AddDays((int)DayOfWeek.Saturday - (int)dt.DayOfWeek + 1);
  62. }
  63. /// <summary>
  64. /// 得到一年中的某周的起始日和截止日 周一到周五 工作日
  65. /// </summary>
  66. /// <param name="_"></param>
  67. /// <param name="nYear">年份</param>
  68. /// <param name="nNumWeek">第几周</param>
  69. /// <param name="dtWeekStart">开始日期</param>
  70. /// <param name="dtWeekeEnd">结束日期</param>
  71. public static void GetWeekWorkTime(this DateTime _, int nYear, int nNumWeek, out DateTime dtWeekStart, out DateTime dtWeekeEnd)
  72. {
  73. var dt = new DateTime(nYear, 1, 1);
  74. dt += new TimeSpan((nNumWeek - 1) * 7, 0, 0, 0);
  75. dtWeekStart = dt.AddDays(-(int)dt.DayOfWeek + (int)DayOfWeek.Monday);
  76. dtWeekeEnd = dt.AddDays((int)DayOfWeek.Saturday - (int)dt.DayOfWeek + 1).AddDays(-2);
  77. }
  78. #region P/Invoke 设置本地时间
  79. [DllImport("kernel32.dll")]
  80. private static extern bool SetLocalTime(ref SystemTime time);
  81. [StructLayout(LayoutKind.Sequential)]
  82. private struct SystemTime
  83. {
  84. public short year;
  85. public short month;
  86. public short dayOfWeek;
  87. public short day;
  88. public short hour;
  89. public short minute;
  90. public short second;
  91. public short milliseconds;
  92. }
  93. /// <summary>
  94. /// 设置本地计算机时间
  95. /// </summary>
  96. /// <param name="dt">DateTime对象</param>
  97. public static void SetLocalTime(this DateTime dt)
  98. {
  99. SystemTime st;
  100. st.year = (short)dt.Year;
  101. st.month = (short)dt.Month;
  102. st.dayOfWeek = (short)dt.DayOfWeek;
  103. st.day = (short)dt.Day;
  104. st.hour = (short)dt.Hour;
  105. st.minute = (short)dt.Minute;
  106. st.second = (short)dt.Second;
  107. st.milliseconds = (short)dt.Millisecond;
  108. SetLocalTime(ref st);
  109. }
  110. #endregion
  111. }
  112. }