using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; namespace GanovCubes { public enum TimeOperationType { Прибавить, Вычесть } #region CubeDescription [System.Obsolete] [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, IDoubleInput0, IDoubleInput1, IDoubleReturns { public IContext Context { get; set; } /// /// Тип операции /// [HandlerParameter(true, "Вычесть", NotOptimized = false, Name = "Тип операции", IsVisibleInBlock = true)] [Description("Тип операции: Прибавить, Вычесть. Определяет необходимое действие с временем")] public TimeOperationType OperType { get; set; } public IList Execute(IList timeSerie, IList minutesSerie) { var minutesToAddSubstract = (int)minutesSerie.FirstOrDefault(); var retValue = Context.GetArray(Context.BarsCount); for (int i = 0; i < timeSerie.Count; i++) { var tsLabTime = (int)timeSerie[i]; if (tsLabTime % 1 != 0 || tsLabTime > 235959 || tsLabTime < 0) { retValue[i] = 0; continue; } var newTime = AddSubstractMinutes(tsLabTime, minutesToAddSubstract); retValue[i] = newTime; } return retValue; } /// /// Метод производит вычитание или прибавление периода в минутах к заданному времени /// /// Время в формате ТСЛаб /// Кол-во минут /// Время в формате ТСЛаб после вычета/добавления минут 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.Прибавить ? 1 : -1), 0)); if (newTime.Hours < 0) newTime += new TimeSpan(24, 0, 0); return newTime.Hours * 10000 + newTime.Minutes * 100 + newTime.Seconds; } } }