DateTimeRange.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using Masuit.Tools.DateTimeExt;
  2. using System;
  3. using System.Collections.Generic;
  4. namespace Masuit.Tools.Models;
  5. /// <summary>
  6. /// 时间段
  7. /// </summary>
  8. public class DateTimeRange : ITimePeriod
  9. {
  10. public DateTimeRange(DateTime start, DateTime end)
  11. {
  12. if (start > end)
  13. {
  14. throw new Exception("开始时间不能大于结束时间");
  15. }
  16. Start = start;
  17. End = end;
  18. }
  19. public DateTimeRange()
  20. {
  21. }
  22. /// <summary>
  23. /// 起始时间
  24. /// </summary>
  25. public DateTime Start { get; set; }
  26. /// <summary>
  27. /// 结束时间
  28. /// </summary>
  29. public DateTime End { get; set; }
  30. /// <summary>
  31. /// 是否相交
  32. /// </summary>
  33. /// <param name="start"></param>
  34. /// <param name="end"></param>
  35. /// <returns></returns>
  36. public bool HasIntersect(DateTime start, DateTime end)
  37. {
  38. return HasIntersect(new DateTimeRange(start, end));
  39. }
  40. /// <summary>
  41. /// 是否相交
  42. /// </summary>
  43. /// <param name="range"></param>
  44. /// <returns></returns>
  45. public bool HasIntersect(DateTimeRange range)
  46. {
  47. return Start.In(range.Start, range.End) || End.In(range.Start, range.End);
  48. }
  49. /// <summary>
  50. /// 相交时间段
  51. /// </summary>
  52. /// <param name="range"></param>
  53. /// <returns></returns>
  54. public (bool intersected, DateTimeRange range) Intersect(DateTimeRange range)
  55. {
  56. if (HasIntersect(range.Start, range.End))
  57. {
  58. var list = new List<DateTime>() { Start, range.Start, End, range.End };
  59. list.Sort();
  60. return (true, new DateTimeRange(list[1], list[2]));
  61. }
  62. return (false, null);
  63. }
  64. /// <summary>
  65. /// 相交时间段
  66. /// </summary>
  67. /// <param name="start"></param>
  68. /// <param name="end"></param>
  69. /// <returns></returns>
  70. public (bool intersected, DateTimeRange range) Intersect(DateTime start, DateTime end)
  71. {
  72. return Intersect(new DateTimeRange(start, end));
  73. }
  74. /// <summary>
  75. /// 是否包含时间段
  76. /// </summary>
  77. /// <param name="range"></param>
  78. /// <returns></returns>
  79. public bool Contains(DateTimeRange range)
  80. {
  81. return range.Start.In(Start, End) && range.End.In(Start, End);
  82. }
  83. /// <summary>
  84. /// 是否包含时间段
  85. /// </summary>
  86. /// <param name="start"></param>
  87. /// <param name="end"></param>
  88. /// <returns></returns>
  89. public bool Contains(DateTime start, DateTime end)
  90. {
  91. return Contains(new DateTimeRange(start, end));
  92. }
  93. /// <summary>
  94. /// 是否在时间段内
  95. /// </summary>
  96. /// <param name="range"></param>
  97. /// <returns></returns>
  98. public bool In(DateTimeRange range)
  99. {
  100. return Start.In(range.Start, range.End) && End.In(range.Start, range.End);
  101. }
  102. /// <summary>
  103. /// 是否在时间段内
  104. /// </summary>
  105. /// <param name="start"></param>
  106. /// <param name="end"></param>
  107. /// <returns></returns>
  108. public bool In(DateTime start, DateTime end)
  109. {
  110. return In(new DateTimeRange(start, end));
  111. }
  112. /// <summary>
  113. /// 合并时间段
  114. /// </summary>
  115. /// <param name="range"></param>
  116. /// <returns></returns>
  117. public DateTimeRange Union(DateTimeRange range)
  118. {
  119. if (HasIntersect(range))
  120. {
  121. var list = new List<DateTime>() { Start, range.Start, End, range.End };
  122. list.Sort();
  123. return new DateTimeRange(list[0], list[3]);
  124. }
  125. throw new Exception("不相交的时间段不能合并");
  126. }
  127. /// <summary>
  128. /// 合并时间段
  129. /// </summary>
  130. /// <param name="start"></param>
  131. /// <param name="end"></param>
  132. /// <returns></returns>
  133. public DateTimeRange Union(DateTime start, DateTime end)
  134. {
  135. return Union(new DateTimeRange(start, end));
  136. }
  137. /// <summary>返回一个表示当前对象的 string。</summary>
  138. /// <returns>表示当前对象的字符串。</returns>
  139. public override string ToString()
  140. {
  141. return $"{Start:yyyy-MM-dd HH:mm:ss}~{End:yyyy-MM-dd HH:mm:ss}";
  142. }
  143. public override bool Equals(object obj)
  144. {
  145. if (obj is DateTimeRange range)
  146. {
  147. return Start.Date == range.Start.Date && End.Date == range.End.Date;
  148. }
  149. return false;
  150. }
  151. }