C#有没有办法列出时间范围?配置

时间:2012-07-23 02:36:53

标签: c# .net visual-studio-2010

有没有办法列出时间范围? 例如: 列表包含: 中午12:00至下午1:00 下午1:00到2:00 等等... 分隔部分是配置。 我认为你必须使用datetime并将其除以某个数字(在这种情况下为一小时)

有人可以指出我正确的方向或给我一个例子吗?

提前致谢!

1 个答案:

答案 0 :(得分:6)

没有定义时间范围的内置类型,但通过组合DateTimeTimeSpan来创建时间范围非常容易。例如:

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

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

然后,您可以使用特定List<TimeRange>作为起点构建DateTime,并为每个元素添加所需的TimeSpan。例如,这是TimeRange的一个非常基本的实现,包括一个名为Split的方法,它根据当前IEnumerable<TimeRange>和子范围所需的持续时间返回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();

这将列出从当前时间开始的1个小时的12个时间范围。

**更新**

请注意,上述实现非常基础。例如,Split方法将很乐意产生一系列范围,如果子持续时间不是父范围的整数除法,则最后一个子范围的末尾超出父范围的末尾。但是,要为这种事情添加检查是很困难的。真正的问题是你想在这种场景中发生什么。

创建一个静态TimeRange.CreateList方法,构建List<TimeRange>而不需要显式父范围也很容易。