日期从开始到结束

时间:2018-07-05 10:22:29

标签: c# date-range

上下文

所以我有一个在两个日期之间将处于活动状态的用户:

User.StartDate
User.EndDate

在此期间,用户可以选择要处理的任务。

Task.StartDate
Task.EndDate

注意:每个结束日期都可以为空。

如果在User上未定义EndDate,则该用户将始终处于活动状态,并且永远不会离开。

如果任务没有结束日期,则该任务将永远不会结束,并且始终对任务之后启动的用户可用。

尝试在C#中找到一种巧妙的方法来获取经过过滤的List<Task>任务,用户处于活动状态,并且任务日期范围处于该活动时间段内。

我的解决方案

到目前为止,这是我想出的,有人会建议更好吗?

/// <summary>
/// Filter a list of Task so only tasks falling between dates will be returned.
/// If toDateTime is not defined, then it's considered open ended
/// </summary>
/// <param name="tasks"></param>
/// <param name="fromDateTime"></param>
/// <param name="toDateTime"></param>
/// <returns>A filtered list of tasks</returns>
public List<Task> FilterRatesOnDates(
    List<Task> tasks,
    DateTime fromDateTime,
    DateTime? toDateTime)
{
    tasks = tasks.FindAll(p =>
        ((p.ToDate.HasValue && fromDateTime <= p.ToDate) 
             || !p.ToDate.HasValue)
             && 
         ((toDateTime.HasValue && toDateTime >= p.FromDate)
             || !toDateTime.HasValue)
    );

    return tasks;
}

1 个答案:

答案 0 :(得分:1)

我最近遇到了类似的问题,并被介绍给Fowler's Range。尽管示例不在C#中,但它们很容易翻译。这是我的:

public interface IRange<T>
{
    T Start { get; }
    T End { get; }
    bool Includes(T value);
    bool Includes(IRange<T> range);
}

public class DateRange : IRange<DateTime>
{
    public DateRange(DateTime start, DateTime end)
    {
        Start = start;
        End = end;
    }

    public DateTime Start { get; private set; }
    public DateTime End { get; private set; }

    public bool Includes(DateTime value)
    {
        return (Start <= value) && (value <= End);
    }

    public bool Includes(IRange<DateTime> range)
    {
        return (Start <= range.Start) && (range.End <= End);
    }
}

并按如下方式使用:

DateRange range = new DateRange(firstDate, secondDate);
bool inRange = range.Includes(dateToTest);

根据您的情况,检查两个任务的日期是否在要求的范围内。