Пример #1
0
        internal static DoubleRange ApplyBusinessHoursRangePadding(DateTimeAxis axis, DoubleRange range, double interval, DateTimeRangePadding rangePadding, DateTimeIntervalType intervalType)
        {
            DateTime startDate = range.Start.FromOADate();
            DateTime endDate   = range.End.FromOADate();
            var      startTime = new TimeSpan((int)axis.OpenTime, 0, 0);
            var      endTime   = new TimeSpan((int)axis.CloseTime, 0, 0);

            if (rangePadding == DateTimeRangePadding.Round || rangePadding == DateTimeRangePadding.Additional)
            {
                switch (intervalType)
                {
                case DateTimeIntervalType.Years:
                    int startYear = (int)((int)(startDate.Year / interval) * interval);
                    int endYear   = endDate.Year + (startDate.Year - startYear);
                    if (startYear <= 0)
                    {
                        startYear = 1;
                    }

                    if (endYear <= 0)
                    {
                        endYear = 1;
                    }

                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(new DateTime(startYear, 1, 1, 0, 0, 0).ToOADate(), new DateTime(endYear, 12, 31, 23, 59, 59).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(startYear - (int)interval, 1, 1, 0, 0, 0).ToOADate(), new DateTime(endYear + (int)interval, 12, 31, 23, 59, 59).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Months:
                    int month = (int)((int)(startDate.Month / interval) * interval);
                    if (month <= 0)
                    {
                        month = 1;
                    }

                    int endmonth = range.End.FromOADate().Month + (startDate.Month - month);
                    if (endmonth <= 0)
                    {
                        endmonth = 1;
                    }

                    if (endmonth > 12)
                    {
                        endmonth = 12;
                    }
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(new DateTime(startDate.Year, month, 1, 0, 0, 0).ToOADate(), new DateTime(endDate.Year, endmonth, endmonth == 2 ? 28 : 30, 0, 0, 0).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(startDate.Year, month, 1, 0, 0, 0).AddMonths((int)(-interval)).ToOADate(), new DateTime(endDate.Year, endmonth, endmonth == 2 ? 28 : 30, 0, 0, 0).AddMonths((int)interval).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Days:
                    int day = (int)((int)(startDate.Day / interval) * interval);

                    if (day <= 0)
                    {
                        day = 1;
                    }

                    int endday = startDate.Day - day;
                    if (endday < 0)
                    {
                        endday = 1;
                    }

                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(
                            new DateTime(startDate.Year, startDate.Month, day, startTime.Hours, startTime.Minutes, startTime.Seconds).ToOADate(),
                            new DateTime(endDate.Year, endDate.Month, endDate.Day, endTime.Hours, endTime.Minutes, endTime.Seconds).AddDays(endday).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(startDate.Year, startDate.Month, day, startTime.Hours, startTime.Minutes, startTime.Seconds).AddDays(-interval).ToOADate(),
                                                new DateTime(endDate.Year, endDate.Month, endDate.Day, endTime.Hours, endTime.Minutes, endTime.Seconds).AddDays(interval + endday).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Hours:
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(
                            new DateTime(
                                startDate.Year,
                                startDate.Month,
                                startDate.Day,
                                startTime.Hours,
                                0,
                                0).ToOADate(), new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endTime.Hours,
                                0,
                                0).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(
                                                    startDate.Year,
                                                    startDate.Month,
                                                    startDate.Day,
                                                    startDate.Hour,
                                                    0,
                                                    0).AddHours(-interval).ToOADate(), new DateTime(
                                                    endDate.Year,
                                                    endDate.Month,
                                                    endDate.Day,
                                                    endDate.Hour,
                                                    0,
                                                    0).AddHours(interval).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Minutes:
                    int minute    = (int)((int)(startDate.Minute / interval) * interval);
                    int endminute = range.End.FromOADate().Minute + (startDate.Minute - minute);
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(
                            new DateTime(
                                startDate.Year,
                                startDate.Month,
                                startDate.Day,
                                startDate.Hour,
                                minute,
                                0).ToOADate(), new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endDate.Hour,
                                endminute,
                                0).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(
                                                    startDate.Year,
                                                    startDate.Month,
                                                    startDate.Day,
                                                    startDate.Hour,
                                                    startDate.Minute,
                                                    0).AddMinutes(-interval).ToOADate(), new DateTime(
                                                    endDate.Year,
                                                    endDate.Month,
                                                    endDate.Day,
                                                    endDate.Hour,
                                                    endDate.Minute,
                                                    0).AddMinutes(interval).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Seconds:
                    int second    = (int)((int)(startDate.Second / interval) * interval);
                    int endsecond = range.End.FromOADate().Second + (startDate.Second - second);
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(
                            new DateTime(
                                startDate.Year,
                                startDate.Month,
                                startDate.Day,
                                startDate.Hour,
                                startDate.Minute,
                                second,
                                0).ToOADate(),
                            new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endDate.Hour,
                                endDate.Minute,
                                endsecond,
                                0).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(
                                                    startDate.Year,
                                                    startDate.Month,
                                                    startDate.Day,
                                                    startDate.Hour,
                                                    startDate.Minute,
                                                    startDate.Second,
                                                    0).AddSeconds(-interval).ToOADate(), new DateTime(
                                                    endDate.Year,
                                                    endDate.Month,
                                                    endDate.Day,
                                                    endDate.Hour,
                                                    endDate.Minute,
                                                    endDate.Second,
                                                    0).AddSeconds(interval).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Milliseconds:
                    int milliseconds    = (int)((int)(startDate.Millisecond / interval) * interval);
                    int endmilliseconds = range.End.FromOADate().Millisecond + (startDate.Millisecond - milliseconds);
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(
                            new DateTime(
                                startDate.Year,
                                startDate.Month,
                                startDate.Day,
                                startDate.Hour,
                                startDate.Minute,
                                startDate.Second,
                                milliseconds).ToOADate(),
                            new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endDate.Hour,
                                endDate.Minute,
                                endDate.Second,
                                endmilliseconds).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(
                            new DateTime(
                                startDate.Year,
                                startDate.Month,
                                startDate.Day,
                                startDate.Hour,
                                startDate.Minute,
                                startDate.Second,
                                startDate.Millisecond).AddMilliseconds(-interval).ToOADate(),
                            new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endDate.Hour,
                                endDate.Minute,
                                endDate.Second,
                                endDate.Millisecond).AddMilliseconds(interval).ToOADate());
                    }
                    break;
                }

                var newStartDate = range.Start.FromOADate();
                var newEndDate   = range.End.FromOADate();

                newStartDate = newStartDate.ValidateNonWorkingDate(axis.InternalWorkingDays, true, axis.NonWorkingDays.Count);
                newStartDate = newStartDate.ValidateNonWorkingHours(axis.OpenTime, axis.CloseTime, true);
                newStartDate = newStartDate.ValidateNonWorkingDate(axis.InternalWorkingDays, true, axis.NonWorkingDays.Count);

                newEndDate = newEndDate.ValidateNonWorkingDate(axis.InternalWorkingDays, false, axis.NonWorkingDays.Count);
                newEndDate = newEndDate.ValidateNonWorkingHours(axis.OpenTime, axis.CloseTime, false);
                newEndDate = newEndDate.ValidateNonWorkingDate(axis.InternalWorkingDays, false, axis.NonWorkingDays.Count);

                return(new DoubleRange(newStartDate.ToOADate(), newEndDate.ToOADate()));
            }

            return(range);
        }
Пример #2
0
        /// <summary>
        /// Apply padding based on interval
        /// </summary>
        /// <param name="axis"></param>
        /// <param name="range"></param>
        /// <param name="interval"></param>
        /// <param name="rangePadding"></param>
        /// <param name="intervalType"></param>
        /// <returns></returns>
        internal static DoubleRange ApplyRangePadding(ChartAxis axis, DoubleRange range, double interval, DateTimeRangePadding rangePadding, DateTimeIntervalType intervalType)
        {
            DateTime startDate    = range.Start.FromOADate();
            DateTime endDate      = range.End.FromOADate();
            var      dateTimeAxis = axis as DateTimeAxis;

            if (dateTimeAxis != null && dateTimeAxis.EnableBusinessHours)
            {
                return(ApplyBusinessHoursRangePadding(dateTimeAxis, range, interval, rangePadding, intervalType));
            }
            if (rangePadding == DateTimeRangePadding.Round || rangePadding == DateTimeRangePadding.Additional)
            {
                switch (intervalType)
                {
                case DateTimeIntervalType.Years:
                    int startYear = (int)((int)(startDate.Year / interval) * interval);
                    int endYear   = endDate.Year + (startDate.Year - startYear);
                    if (startYear <= 0)
                    {
                        startYear = 1;
                    }

                    if (endYear <= 0)
                    {
                        endYear = 1;
                    }

                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(new DateTime(startYear, 1, 1, 0, 0, 0).ToOADate(), new DateTime(endYear, 12, 31, 23, 59, 59).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(startYear - (int)interval, 1, 1, 0, 0, 0).ToOADate(), new DateTime(endYear + (int)interval, 12, 31, 23, 59, 59).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Months:
                    int month = (int)((int)(startDate.Month / interval) * interval);
                    if (month <= 0)
                    {
                        month = 1;
                    }

                    int endmonth = range.End.FromOADate().Month + (startDate.Month - month);
                    if (endmonth <= 0)
                    {
                        endmonth = 1;
                    }

                    if (endmonth > 12)
                    {
                        endmonth = 12;
                    }
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(new DateTime(startDate.Year, month, 1, 0, 0, 0).ToOADate(), new DateTime(endDate.Year, endmonth, endmonth == 2 ? 28 : 30, 0, 0, 0).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(startDate.Year, month, 1, 0, 0, 0).AddMonths((int)(-interval)).ToOADate(), new DateTime(endDate.Year, endmonth, endmonth == 2 ? 28 : 30, 0, 0, 0).AddMonths((int)interval).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Days:
                    int day = (int)((int)(startDate.Day / interval) * interval);
                    if (day <= 0)
                    {
                        day = 1;
                    }

                    int endday = startDate.Day - day;
                    if (endday <= 0)
                    {
                        endday = 1;
                    }

                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(new DateTime(startDate.Year, startDate.Month, day, 0, 0, 0).ToOADate(), new DateTime(endDate.Year, endDate.Month, endDate.Day, 23, 59, 59).AddDays(endday).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(startDate.Year, startDate.Month, day, 0, 0, 0).AddDays(-interval).ToOADate(), new DateTime(endDate.Year, endDate.Month, endDate.Day, 23, 59, 59).AddDays(interval + endday).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Hours:
                    int hour    = (int)((int)(startDate.Hour / interval) * interval);
                    int endhour = endDate.Hour + (startDate.Hour - hour);
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(
                            new DateTime(
                                startDate.Year,
                                startDate.Month,
                                startDate.Day,
                                hour,
                                0,
                                0).ToOADate(), new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endhour,
                                0,
                                0).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(
                                                    startDate.Year,
                                                    startDate.Month,
                                                    startDate.Day,
                                                    startDate.Hour,
                                                    0,
                                                    0).AddHours(-interval).ToOADate(), new DateTime(
                                                    endDate.Year,
                                                    endDate.Month,
                                                    endDate.Day,
                                                    endDate.Hour,
                                                    0,
                                                    0).AddHours(interval).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Minutes:
                    int minute    = (int)((int)(startDate.Minute / interval) * interval);
                    int endminute = range.End.FromOADate().Minute + (startDate.Minute - minute);
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(
                            new DateTime(
                                startDate.Year,
                                startDate.Month,
                                startDate.Day,
                                startDate.Hour,
                                minute,
                                0).ToOADate(), new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endDate.Hour,
                                endminute,
                                0).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(
                                                    startDate.Year,
                                                    startDate.Month,
                                                    startDate.Day,
                                                    startDate.Hour,
                                                    startDate.Minute,
                                                    0).AddMinutes(-interval).ToOADate(), new DateTime(
                                                    endDate.Year,
                                                    endDate.Month,
                                                    endDate.Day,
                                                    endDate.Hour,
                                                    endDate.Minute,
                                                    0).AddMinutes(interval).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Seconds:
                    int second    = (int)((int)(startDate.Second / interval) * interval);
                    int endsecond = range.End.FromOADate().Second + (startDate.Second - second);
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(
                            new DateTime(
                                startDate.Year,
                                startDate.Month,
                                startDate.Day,
                                startDate.Hour,
                                startDate.Minute,
                                second,
                                0).ToOADate(), new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endDate.Hour,
                                endDate.Minute,
                                endsecond,
                                0).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(
                                                    startDate.Year,
                                                    startDate.Month,
                                                    startDate.Day,
                                                    startDate.Hour,
                                                    startDate.Minute,
                                                    startDate.Second,
                                                    0).AddSeconds(-interval).ToOADate(), new DateTime(
                                                    endDate.Year,
                                                    endDate.Month,
                                                    endDate.Day,
                                                    endDate.Hour,
                                                    endDate.Minute,
                                                    endDate.Second,
                                                    0).AddSeconds(interval).ToOADate());
                    }
                    break;

                case DateTimeIntervalType.Milliseconds:
                    int milliseconds    = (int)((int)(startDate.Millisecond / interval) * interval);
                    int endmilliseconds = range.End.FromOADate().Millisecond + (startDate.Millisecond - milliseconds);
                    if (rangePadding == DateTimeRangePadding.Round)
                    {
                        range = new DoubleRange(
                            new DateTime(
                                startDate.Year,
                                startDate.Month,
                                startDate.Day,
                                startDate.Hour,
                                startDate.Minute,
                                startDate.Second,
                                milliseconds).ToOADate(), new DateTime(
                                endDate.Year,
                                endDate.Month,
                                endDate.Day,
                                endDate.Hour,
                                endDate.Minute,
                                endDate.Second,
                                endmilliseconds).ToOADate());
                    }
                    else
                    {
                        range = new DoubleRange(new DateTime(
                                                    startDate.Year,
                                                    startDate.Month,
                                                    startDate.Day,
                                                    startDate.Hour,
                                                    startDate.Minute,
                                                    startDate.Second,
                                                    startDate.Millisecond).AddMilliseconds(-interval).ToOADate(), new DateTime(
                                                    endDate.Year,
                                                    endDate.Month,
                                                    endDate.Day,
                                                    endDate.Hour,
                                                    endDate.Minute,
                                                    endDate.Second,
                                                    endDate.Millisecond).AddMilliseconds(interval).ToOADate());
                    }
                    break;
                }

                return(range);
            }

            return(range);
        }