using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; namespace GAA.Cubes.AddSubtractTimeNS { #region CubeDescription [HandlerCategory("Ganov Cubes. DateTime")] [HandlerName("AddSubtractTime", Language = "ru-ru")] [Description("Кубик принимает на вход время формата ТСЛаб и число минут, которые надо вычесть или прибавить от/к указанного времени." + " Если на вход в качестве времени поступает число имеющее дробную часть, число больше 235959, отрицательное число, то кубик вернет значение \"ноль\"." + " В качестве минут можно подавать как положительные, так и отрицательные числа. Дробная часть значения минут откидывается и в расчете используется" + " только целая часть, например, если подать 22.47 минут, то в расчете будет использовано 22 минуты." + "\nКубик имеет следующие входы: " + "\n======================" + "\nДата - время, над которым будет производиться операция сложения или вычитания" + "\nДни - количество минут, которые надо прибавить или вычесть из времени")] [HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87167&page=1", "Описание на форуме ТСлаб", "ru-ru")] [InputsCount(2)] [Input(0, TemplateTypes.DOUBLE, Name = "Время")] [Input(1, TemplateTypes.DOUBLE, Name = "Минуты")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] #endregion public class AddSubtractTime : IContextUses, IStreamHandler, IValuesHandler, IDoubleInput0, IDoubleInput1, IDoubleReturns { public IContext Context { get; set; } /// /// Тип операции /// [HandlerParameter(true, "Subtract", NotOptimized = false, Name = "Тип операции", IsVisibleInBlock = true)] [Description("Тип операции: Прибавить, Вычесть. Определяет необходимое действие с временем")] public TimeOperationType OperType { get; set; } = TimeOperationType.Subtract; /// /// Метод рассчитывает время с учетом сдвига на определенное кол-во минут назад или вперед /// /// Время /// Сдвиг по времени в минутах /// Время с учетом сдвига в минутах public double Execute(double time, double minutesToAddSubtract) { return GetBarTime(time, minutesToAddSubtract); } /// /// Метод формируем колллекцию времени с учетом сдвига на определенное кол-во минут назад или вперед /// /// Время /// Сдвиг по времени в минутах /// Коллецию времени с учетом сдвига в минутах public IList Execute(IList time, IList minutesToAddSubtract) { var barsCount = Context.BarsCount; var retValue = Context.GetArray(Context.BarsCount); if (time.Any() & minutesToAddSubtract.Any()) for (var i = 0; i < barsCount; i++) retValue[i] = GetBarTime(time[i], minutesToAddSubtract[i]); return retValue; } /// /// Метод осуществляет получение единичного значения времени на баре или в режиме /// единичного вычислени /// /// Время бара /// Количество минут, которые надо вычесть или прибавить /// Время после прибавления вычитания в формате ТСЛаб private double GetBarTime(double barTime, double minutesToAddSubtract) { if (barTime % 1 != 0 || barTime > 235959 || barTime < 0) return 0; return AddSubstractMinutes((int)barTime, (int)minutesToAddSubtract); } /// /// Метод производит вычитание или прибавление периода в минутах к заданному времени /// /// Время в формате ТСЛаб /// Кол-во минут /// Время в формате ТСЛаб после вычета/добавления минут private double AddSubstractMinutes(int tsLabInitTime, int minutesToAddSubstract) { var hours = tsLabInitTime / 10000; var minutes = tsLabInitTime % 10000 / 100; var seconds = tsLabInitTime % 10000 % 100; var newTime = new TimeSpan(hours, minutes, seconds).Add(new TimeSpan(0, minutesToAddSubstract * (OperType == TimeOperationType.Add ? 1 : -1), 0)); if (newTime.Hours < 0) newTime += new TimeSpan(24, 0, 0); return (newTime.Hours * 10000) + (newTime.Minutes * 100) + newTime.Seconds; } } }