/// <param name="dateRange">An open ended date range to determine the difference of</param> /// <exception cref="ArgumentException">End date of the date range must be greater than its start</exception> public DateDifference(IOpenEndedDateRange dateRange) { if (dateRange.End.HasValue) { if (dateRange.Start <= dateRange.End.Value) { _earlier = dateRange.Start; _later = dateRange.End.Value; } else { _earlier = dateRange.End.Value; _later = dateRange.Start; } } else throw new ArgumentException($"End date must be greater than {dateRange.Start:F}", nameof(dateRange)); }
private static void ValidityCheck(IOpenEndedDateRange dateRange) { if (dateRange?.End != null) ValidityCheck(dateRange.Start, dateRange.End.Value); }
/// <inheritdoc cref="Overlaps(IDateRange, IDateRange, bool)" /> public static bool Overlaps(this IOpenEndedDateRange dateRange, IOpenEndedDateRange compareRange, bool allowSameEndPoints = true) { if (dateRange == null || compareRange == null) return false; ValidityCheck(dateRange); ValidityCheck(compareRange); if (!dateRange.End.HasValue && compareRange.End.HasValue) { return allowSameEndPoints ? compareRange.Start > dateRange.Start || compareRange.End.Value > dateRange.Start : compareRange.Start >= dateRange.Start || compareRange.End.Value >= dateRange.Start; } if (dateRange.End.HasValue && !compareRange.End.HasValue) { return allowSameEndPoints ? dateRange.Start > compareRange.Start || dateRange.End.Value > compareRange.Start : dateRange.Start >= compareRange.Start || dateRange.End.Value >= compareRange.Start; } if (!dateRange.End.HasValue && !compareRange.End.HasValue) return true; return compareRange.End != null && dateRange.End != null && Date.Overlaps(dateRange.Start, dateRange.End.Value, compareRange.Start, compareRange.End.Value, allowSameEndPoints); }
/// <inheritdoc cref="Overlaps(IDateRange, IDateRange, bool)" /> public static bool Overlaps(this IDateRange dateRange, IOpenEndedDateRange compareRange, bool allowSameEndPoints = true) { if (dateRange == null || compareRange == null) return false; if (compareRange.End.HasValue) return Date.Overlaps(dateRange.Start, dateRange.End, compareRange.Start, compareRange.End.Value, allowSameEndPoints); ValidityCheck(dateRange); ValidityCheck(compareRange); return allowSameEndPoints ? dateRange.Start > compareRange.Start || dateRange.End > compareRange.Start : dateRange.Start >= compareRange.Start || dateRange.End >= compareRange.Start; }
/// <inheritdoc cref="Within(DateTime, IDateRange, bool)" /> public static bool Within(this DateTime? dateTime, IOpenEndedDateRange dateRange, bool allowSameEndPoints = true) { if (dateRange == null) return false; return dateTime?.Within(dateRange, allowSameEndPoints) ?? false; }
/// <inheritdoc cref="Within(DateTime, IDateRange, bool)" /> public static bool Within(this DateTime dateTime, IOpenEndedDateRange dateRange, bool allowSameEndPoints = true) { if (dateRange == null) return false; return allowSameEndPoints ? dateTime > dateRange.Start : dateTime >= dateRange.Start; }