DateTimeRange.cs 4.5 KB

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