using System; using System.ComponentModel; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; namespace GanovCubes { public enum IntervalType { Дней, Часов, Минут }; #region CubeDescription [Obsolete] [HandlerCategory("Ganov Cubes. DateTime")] [HandlerName("IntervalsBetweenDates", Language = "ru-ru")] [Description("Считает количество интервалов: Дней, Часов, Минут между датами")] [HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=86894&page=1", "Страница на форуме TSLab", "ru-ru")] [InputsCount(2)] [Input(0, TemplateTypes.DOUBLE, Name = "StartDate (меньшая дата)")] [Input(1, TemplateTypes.DOUBLE, Name = "EndDate (бОльшая дата)")] [OutputsCount(1)] [OutputType(TemplateTypes.DOUBLE)] #endregion public class IntervalsBetweenDates : IContextUses, IValuesHandler { /// /// Минимальная дата для тестировании на истории /// private const double minHistoryData = 10101; // 01.01.2001 public IContext Context { set; get; } [HandlerParameter(true, "Дней", NotOptimized = true, Name = "Интервал", IsVisibleInBlock = true)] [Description("Интервал: Дней, Часов, Минут")] public IntervalType IntType { get; set; } public double Execute() => CalculateInterval(0, 0); public double Execute(double startDate) => CalculateInterval(startDate, 0); public double Execute(double startDate, double endDate) => CalculateInterval(startDate, endDate); private double CalculateInterval(double startDate, double endDate) { if (startDate == 0 || endDate == 0 || startDate.ToString().Length < 5 || endDate.ToString().Length < 5 || startDate < minHistoryData || endDate < minHistoryData || startDate % 1 != 0 || endDate % 1 != 0) return 0; var dtStartDate = ((int)startDate).ConvertTSLabDateToDateTime(); var dtEndDate = ((int)endDate).ConvertTSLabDateToDateTime(); if (dtStartDate > dtEndDate) return 0; var interval = dtEndDate - dtStartDate; return IntType switch { IntervalType.Дней => interval.TotalDays, IntervalType.Часов => interval.TotalHours, IntervalType.Минут => interval.TotalMinutes, _ => 0 }; } } }