DateRangeHelper.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace MECF.Framework.UI.Client.ClientBase
  7. {
  8. /// <summary>
  9. /// 该类实现对时间范围进行操作,包括按指定间隔分隔时间范围。
  10. /// </summary>
  11. public class DateRangeHelper
  12. {
  13. #region Constructors
  14. public DateRangeHelper(DateTime start, DateTime end)
  15. {
  16. Start = start;
  17. End = end;
  18. }
  19. #endregion
  20. #region Properties
  21. public DateTime Start { get; set; }
  22. public DateTime End { get; set; }
  23. public TimeSpan Diff => End - Start;
  24. #endregion
  25. #region Methods
  26. /// <summary>
  27. /// 将时间范围按天为间隔分割为数组。
  28. /// </summary>
  29. /// <param name="range"></param>
  30. /// <returns></returns>
  31. public static IEnumerable<DateRangeHelper> SplitInToDays(DateRangeHelper range)
  32. {
  33. var ranges = new List<DateRangeHelper>();
  34. var currRange = new DateRangeHelper(range.Start, range.Start.Date.AddDays(1).AddTicks(-1));
  35. while (true)
  36. {
  37. if (currRange.End.Date <= range.End.Date)
  38. {
  39. if (currRange.End > range.End)
  40. currRange.End = range.End;
  41. ranges.Add(currRange);
  42. // 向后移一天
  43. currRange = new DateRangeHelper(currRange.Start.Date.AddDays(1),
  44. currRange.Start.Date.AddDays(2).AddTicks((-1)));
  45. }
  46. else
  47. {
  48. break;
  49. }
  50. }
  51. return ranges;
  52. }
  53. /// <summary>
  54. /// 将时间范围按指定的小时间隔分割为数组。
  55. /// </summary>
  56. /// <param name="range"></param>
  57. /// <param name="hourGap"></param>
  58. /// <returns></returns>
  59. /// <exception cref="NotImplementedException"></exception>
  60. public static IEnumerable<DateRangeHelper> SplitInToHours(DateRangeHelper range, int hourGap)
  61. {
  62. var ranges = new List<DateRangeHelper>();
  63. var timeBegin = range.Start;
  64. if (timeBegin > range.End)
  65. return ranges;
  66. while (true)
  67. {
  68. var timeEnd = timeBegin.AddHours(hourGap);
  69. // 检查是否超过timeStart日期
  70. if (timeEnd.Date > timeBegin.Date)
  71. timeEnd = timeBegin.Date.AddDays(1).AddTicks(-1);
  72. if (timeEnd > range.End)
  73. timeEnd = range.End;
  74. ranges.Add(new DateRangeHelper(timeBegin, timeEnd));
  75. timeBegin = timeEnd.AddTicks(1);
  76. // 如果其实时间大于给定范围,则退出
  77. if (timeBegin > range.End)
  78. break;
  79. }
  80. return ranges;
  81. }
  82. public override string ToString()
  83. {
  84. return $"{Start:yyyy/MM/dd HH:mm:ss.fff} - {End:yyyy/MM/dd HH:mm:ss.fff}";
  85. }
  86. #endregion
  87. }
  88. }