18 using System.Collections.Generic;
19 using System.Collections.ObjectModel;
55 public ReadOnlyCollection<MarketHoursSegment>
Segments {
get; }
79 &&
Segments[0].Start == TimeSpan.Zero
83 for (var i = 0; i <
Segments.Count; i++)
101 public LocalMarketHours(
DayOfWeek day, TimeSpan extendedMarketOpen, TimeSpan marketOpen, TimeSpan marketClose, TimeSpan extendedMarketClose)
102 : this(day,
MarketHoursSegment.GetMarketHoursSegments(extendedMarketOpen, marketOpen, marketClose, extendedMarketClose))
115 : this(day, marketOpen, marketOpen, marketClose, marketClose)
127 public TimeSpan?
GetMarketOpen(TimeSpan time,
bool extendedMarketHours, TimeSpan? previousDayLastSegment =
null)
129 var previousSegment = previousDayLastSegment;
130 bool prevSegmentIsFromPrevDay =
true;
131 for (var i = 0; i <
Segments.Count; i++)
140 previousSegment = segment.End;
141 prevSegmentIsFromPrevDay =
false;
152 return segment.Start;
155 previousSegment = segment.End;
156 prevSegmentIsFromPrevDay =
false;
173 public TimeSpan?
GetMarketClose(TimeSpan time,
bool extendedMarketHours, TimeSpan? nextDaySegmentStart =
null)
175 TimeSpan? nextSegment;
176 bool nextSegmentIsFromNextDay =
false;
177 for (var i = 0; i <
Segments.Count; i++)
187 var potentialNextSegment =
Segments[i+1];
190 if (potentialNextSegment.State !=
MarketHoursState.Market && !extendedMarketHours)
201 nextSegment = nextDaySegmentStart;
202 nextSegmentIsFromNextDay =
true;
222 public bool IsOpen(TimeSpan time,
bool extendedMarketHours)
224 for (var i = 0; i <
Segments.Count; i++)
232 if (segment.Contains(time))
249 public bool IsOpen(TimeSpan start, TimeSpan end,
bool extendedMarketHours)
253 return IsOpen(start, extendedMarketHours);
256 for (var i = 0; i <
Segments.Count; i++)
266 if (segment.Overlaps(start, end))
305 public static bool IsContinuousMarketOpen(TimeSpan? previousSegmentEnd, TimeSpan? nextSegmentStart,
bool prevSegmentIsFromPrevDay =
true)
307 if (previousSegmentEnd !=
null && nextSegmentStart !=
null)
309 if (prevSegmentIsFromPrevDay)
312 return previousSegmentEnd.Value ==
Time.
OneDay && nextSegmentStart.Value == TimeSpan.Zero;
316 return previousSegmentEnd.Value == nextSegmentStart.Value;