C#是否有一种方法可以创建一个时间范围列表?可配置的

6
有没有一种方法可以制作时间范围列表? 例如: 包含以下内容的列表: 12:00到1:00 pm 1:00到2:00 pm 等等... 其中分割部分是配置。 我认为你必须使用datetime并将其分成一定数量(在这种情况下为一小时)。
请问有人能指点我正确的方向或提供一个例子吗?
提前感谢!
1个回答

8

没有内置类型定义时间范围,但是通过组合DateTimeTimeSpan可以很容易地创建一个。例如:

struct TimeRange
{
    private readonly DateTime start;
    private readonly TimeSpan duration;

    public TimeRange ( DateTime start, TimeSpan duration )
    {
        this.start = start;
        this.duration = duration;
    }
}

您可以使用特定的DateTime作为起点,根据每个元素所需的TimeSpan,构建一个List<TimeRange>。以下是TimeRange的一个非常基本的实现,包括一个名为Split的方法,该方法基于当前TimeRange和子范围所需的持续时间返回一个IEnumerable<TimeRange>
struct TimeRange
{
    private readonly DateTime start;
    private readonly TimeSpan duration;

    public TimeRange ( DateTime start, TimeSpan duration )
    {
        this.start = start;
        this.duration = duration;
    }

    public DateTime From { get { return start; } }

    public DateTime To { get { return start + duration; } }

    public TimeSpan Duration { get { return duration; } }

    public IEnumerable<TimeRange> Split (TimeSpan subDuration)
    {
        for (DateTime subRangeStart = From; subRangeStart < this.To; subRangeStart += subDuration)
        {
            yield return new TimeRange(subRangeStart, subDuration);
        }
    }

    public override string ToString()
    {
        return String.Format ("{0} -> {1}", From, To);
    }
}

你可以像这样做:
TimeRange mainRange = new TimeRange(DateTime.Now, new TimeSpan(12, 0, 0));
List<TimeRange> rangeList = mainRange.Split(new TimeSpan(1, 0, 0)).ToList();

这将提供一个列表,包含12个持续1小时的时间范围,从当前时间开始。
**更新**
需要注意的是上述实现非常基础。例如,Split方法将快乐地生成一系列范围,其中最后一个子范围的结束超出了父范围的结束,如果子时长不是父范围的整数分割。检查这种情况会很困难。真正的问题是在这种情况下您想要发生什么。
此外,非常容易创建一个静态的TimeRange.CreateList方法,该方法构建一个List,而无需明确指定父范围。

这是一个非常好的答案。如果将持续时间设置为2,那么我会得到确切的2小时吗?例如:TimeRange(10,2),所以我会得到10点到12点作为范围? - Ryan Fung
我很想说“试一试就知道了”,但是没错,这就是你会得到的。你也可以使用new TimeSpan(1, 30, 0)的时间段来获得一个1.5小时的范围(例如10:00到11:30)。 - Andrew Cooper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接