/// <summary> /// Returns the date of the session in progress at the given moment in time /// <paramref name="at"/>. /// </summary> public static DateStamp GetSessionDate(IInstrument instrument, TimeStamp at) { if (instrument.SettlementTime.TimeOfDay.TotalHours <= 0) { throw new ArgumentException("Settlement time of day with zero or negative time is not supported."); } if (instrument.SettlementTime.TimeOfDay.TotalHours > 24) { throw new ArgumentException("Settlement time of day in early morning of following day is not yet supported."); } var atTimeOfDay = at.ToTimeOfDay(instrument.SettlementTime.TimeZone); var nextSettlement = at.GetNext(instrument.SettlementTime.TimeOfDay, instrument.SettlementTime.TimeZone); var nextSettlementDate = nextSettlement.GetDate(instrument.SettlementTime.TimeZone); if (atTimeOfDay <= instrument.SettlementTime.TimeOfDay) { return(instrument.ThisOrNextTradingDay(nextSettlementDate)); } return(instrument.ThisOrNextTradingDay(nextSettlementDate.AddDays(1))); }