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); }
/// <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); }