Rock.Web.UI.Controls.SlidingDateRangePicker.CalculateDateRangeFromDelimitedValues C# (CSharp) Method

CalculateDateRangeFromDelimitedValues() public static method

Calculates the date range from delimited values in format SlidingDateRangeType|Number|TimeUnitType|StartDate|EndDate NOTE: The Displayed End Date is one day before the actual end date. So, if your date range is displayed as 1/3/2015 to 1/4/2015, this will return 1/5/2015 12:00 AM as the End Date
public static CalculateDateRangeFromDelimitedValues ( string value ) : DateRange
value string The value.
return DateRange
        public static DateRange CalculateDateRangeFromDelimitedValues( string value )
        {
            string[] splitValues = ( value ?? "1||4||" ).Split( '|' );
            DateRange result = new DateRange();
            if ( splitValues.Length == 5 )
            {
                var slidingDateRangeMode = splitValues[0].ConvertToEnum<SlidingDateRangeType>();
                var numberOfTimeUnits = splitValues[1].AsIntegerOrNull() ?? 1;
                TimeUnitType? timeUnit = splitValues[2].ConvertToEnumOrNull<TimeUnitType>();
                DateTime currentDateTime = RockDateTime.Now;
                if ( slidingDateRangeMode == SlidingDateRangeType.Current )
                {
                    switch ( timeUnit )
                    {
                        case TimeUnitType.Hour:
                            result.Start = new DateTime( currentDateTime.Year, currentDateTime.Month, currentDateTime.Day, currentDateTime.Hour, 0, 0 );
                            result.End = result.Start.Value.AddHours( 1 );
                            break;

                        case TimeUnitType.Day:
                            result.Start = currentDateTime.Date;
                            result.End = result.Start.Value.AddDays( 1 );
                            break;

                        case TimeUnitType.Week:

                            // from http://stackoverflow.com/a/38064/1755417
                            int diff = currentDateTime.DayOfWeek - RockDateTime.FirstDayOfWeek;
                            if ( diff < 0 )
                            {
                                diff += 7;
                            }

                            result.Start = currentDateTime.AddDays( -1 * diff ).Date;
                            result.End = result.Start.Value.AddDays( 7 );
                            break;

                        case TimeUnitType.Month:
                            result.Start = new DateTime( currentDateTime.Year, currentDateTime.Month, 1 );
                            result.End = result.Start.Value.AddMonths( 1 );
                            break;

                        case TimeUnitType.Year:
                            result.Start = new DateTime( currentDateTime.Year, 1, 1 );
                            result.End = new DateTime( currentDateTime.Year + 1, 1, 1 );
                            break;
                    }
                }
                else if ( ( SlidingDateRangeType.Last | SlidingDateRangeType.Previous ).HasFlag( slidingDateRangeMode ) )
                {
                    // Last X Days/Hours. NOTE: addCount is the number of X that it go back (it'll actually subtract)
                    int addCount = numberOfTimeUnits;

                    // if we are getting "Last" round up to include the current day/week/month/year
                    int roundUpCount = slidingDateRangeMode == SlidingDateRangeType.Last ? 1 : 0;

                    switch ( timeUnit )
                    {
                        case TimeUnitType.Hour:
                            result.End = new DateTime( currentDateTime.Year, currentDateTime.Month, currentDateTime.Day, currentDateTime.Hour, 0, 0 ).AddHours( roundUpCount );
                            result.Start = result.End.Value.AddHours( -addCount );
                            break;

                        case TimeUnitType.Day:
                            result.End = currentDateTime.Date.AddDays( roundUpCount );
                            result.Start = result.End.Value.AddDays( -addCount );
                            break;

                        case TimeUnitType.Week:
                            // from http://stackoverflow.com/a/38064/1755417
                            int diff = currentDateTime.DayOfWeek - RockDateTime.FirstDayOfWeek;
                            if ( diff < 0 )
                            {
                                diff += 7;
                            }

                            result.End = currentDateTime.AddDays( -1 * diff ).Date.AddDays( 7 * roundUpCount );
                            result.Start = result.End.Value.AddDays( -addCount * 7 );
                            break;

                        case TimeUnitType.Month:
                            result.End = new DateTime( currentDateTime.Year, currentDateTime.Month, 1 ).AddMonths( roundUpCount );
                            result.Start = result.End.Value.AddMonths( -addCount );
                            break;

                        case TimeUnitType.Year:
                            result.End = new DateTime( currentDateTime.Year, 1, 1 ).AddYears( roundUpCount );
                            result.Start = result.End.Value.AddYears( -addCount );
                            break;
                    }

                    // don't let Last,Previous have any future dates
                    var cutoffDate = RockDateTime.Now.Date.AddDays( 1 );
                    if ( result.End.Value.Date > cutoffDate )
                    {
                        result.End = cutoffDate;
                    }
                }
                else if ( ( SlidingDateRangeType.Next | SlidingDateRangeType.Upcoming ).HasFlag( slidingDateRangeMode ) )
                {
                    // Next X Days,Hours,etc
                    int addCount = numberOfTimeUnits;

                    // if we are getting "Upcoming", round up to exclude the current day/week/month/year
                    int roundUpCount = slidingDateRangeMode == SlidingDateRangeType.Upcoming ? 1 : 0;

                    switch ( timeUnit )
                    {
                        case TimeUnitType.Hour:
                            result.Start = new DateTime( currentDateTime.Year, currentDateTime.Month, currentDateTime.Day, currentDateTime.Hour, 0, 0 ).AddHours( roundUpCount );
                            result.End = result.Start.Value.AddHours( addCount );
                            break;

                        case TimeUnitType.Day:
                            result.Start = currentDateTime.Date.AddDays( roundUpCount );
                            result.End = result.Start.Value.AddDays( addCount );
                            break;

                        case TimeUnitType.Week:
                            // from http://stackoverflow.com/a/38064/1755417
                            int diff = currentDateTime.DayOfWeek - RockDateTime.FirstDayOfWeek;
                            if ( diff < 0 )
                            {
                                diff += 7;
                            }

                            result.Start = currentDateTime.AddDays( -1 * diff ).Date.AddDays( 7 * roundUpCount );
                            result.End = result.Start.Value.AddDays( addCount * 7 );
                            break;

                        case TimeUnitType.Month:
                            result.Start = new DateTime( currentDateTime.Year, currentDateTime.Month, 1 ).AddMonths( roundUpCount );
                            result.End = result.Start.Value.AddMonths( addCount );
                            break;

                        case TimeUnitType.Year:
                            result.Start = new DateTime( currentDateTime.Year, 1, 1 ).AddYears( roundUpCount );
                            result.End = result.Start.Value.AddYears( addCount );
                            break;
                    }

                    // don't let Next,Upcoming have any past dates
                    if ( result.Start.Value.Date < RockDateTime.Now.Date )
                    {
                        result.Start = RockDateTime.Now.Date;
                    }
                }
                else if ( slidingDateRangeMode == SlidingDateRangeType.DateRange )
                {
                    result.Start = splitValues[3].AsDateTime();
                    DateTime? endDateTime = splitValues[4].AsDateTime();
                    if ( endDateTime.HasValue )
                    {
                        // add a day to the end since the compare will be "< EndDateTime"
                        result.End = endDateTime.Value.AddDays( 1 );
                    }
                    else
                    {
                        result.End = null;
                    }
                }

                // If time unit is days, weeks, months or years subtract a second from time so that end time is with same period
                if ( result.End.HasValue && timeUnit != TimeUnitType.Hour )
                {
                    result.End = result.End.Value.AddSeconds( -1 );
                }

            }

            return result;
        }

Usage Example

        /// <summary>
        /// Formats the delimited values as a phrase such as "Last 14 Days"
        /// </summary>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public static string FormatDelimitedValues(string value)
        {
            string[] splitValues = (value ?? string.Empty).Split('|');
            string   result      = string.Empty;

            if (splitValues.Length == 5)
            {
                var    slidingDateRangeMode = splitValues[0].ConvertToEnum <SlidingDateRangeType>();
                var    numberOfTimeUnits    = splitValues[1].AsIntegerOrNull() ?? 1;
                var    timeUnitType         = splitValues[2].ConvertToEnumOrNull <TimeUnitType>();
                string timeUnitText         = timeUnitType != null?timeUnitType.ConvertToString().PluralizeIf(numberOfTimeUnits != 1) : null;

                var start = splitValues[3].AsDateTime();
                var end   = splitValues[4].AsDateTime();
                if (slidingDateRangeMode == SlidingDateRangeType.Current)
                {
                    return(string.Format("{0} {1}", slidingDateRangeMode.ConvertToString(), timeUnitText));
                }
                else if ((SlidingDateRangeType.Last | SlidingDateRangeType.Previous | SlidingDateRangeType.Next | SlidingDateRangeType.Upcoming).HasFlag(slidingDateRangeMode))
                {
                    return(string.Format("{0} {1} {2}", slidingDateRangeMode.ConvertToString(), numberOfTimeUnits, timeUnitText));
                }
                else
                {
                    // DateRange
                    var dateRange = SlidingDateRangePicker.CalculateDateRangeFromDelimitedValues(value);
                    return(dateRange.ToStringAutomatic());
                }
            }

            return(result);
        }
All Usage Examples Of Rock.Web.UI.Controls.SlidingDateRangePicker::CalculateDateRangeFromDelimitedValues