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