public static DateTime GetDateFromDynamic(DateMagnitude magnitude, int offset, bool isEndDate, DateTimeOffset todaysDate, DayOfWeek weekStart, TimeZoneInfo timeZone) { var localToday = TimeZoneInfo.ConvertTime(todaysDate, timeZone); DateTimeOffset result; if (isEndDate) offset++; switch (magnitude) { case DateMagnitude.BusinessDay: var offsetMagn = Math.Abs(offset); var offsetSign = Math.Sign(offset); var i = 0; result = localToday; while (i < offsetMagn) { result = result.AddDays(offsetSign); if (result.DayOfWeek != DayOfWeek.Sunday && result.DayOfWeek != DayOfWeek.Saturday) i++; } break; case DateMagnitude.Week: result = GetWeekStart(todaysDate, weekStart).AddDays(offset * 7); break; case DateMagnitude.Month: result = new DateTimeOffset(todaysDate.Year, todaysDate.Month, 1, 0, 0, 0, localToday.Offset).AddMonths(offset); break; case DateMagnitude.Quarter: switch (todaysDate.Month) { case 1: case 2: case 3: result = new DateTimeOffset(todaysDate.Year, 1, 1, 0, 0, 0, localToday.Offset).AddMonths(offset * 3); break; case 4: case 5: case 6: result = new DateTimeOffset(todaysDate.Year, 4, 1, 0, 0, 0, localToday.Offset).AddMonths(offset * 3); break; case 7: case 8: case 9: result = new DateTimeOffset(todaysDate.Year, 7, 1, 0, 0, 0, localToday.Offset).AddMonths(offset * 3); break; default: result = new DateTimeOffset(todaysDate.Year, 10, 1, 0, 0, 0, localToday.Offset).AddMonths(offset * 3); break; } break; case DateMagnitude.Year: result = new DateTimeOffset(todaysDate.Year, 1, 1, 0, 0, 0, localToday.Offset).AddYears(offset * 3); break; default: result = todaysDate.AddDays(offset); break; } if (isEndDate) return result.Date.AddMilliseconds(-1); return result.Date; }
/// <summary> /// Initializes a structure to represent a relative date specified by a magnitude and offset /// </summary> /// <param name="offset">The amount of time units to offset.</param> /// <param name="magnitude">The magnitude of the offset (e.g. days, weeks, months, etc).</param> public DateOffset(short offset, DateMagnitude magnitude) { _offset = offset; Magnitude = magnitude; FirstDayOfWeek = DayOfWeek.Sunday; }