有没有办法在C#中定义时间间隔?

时间:2015-09-24 18:44:08

标签: c# .net

我想定义一个时间间隔并检查System.DateTime.Now是否在该时间间隔内。有没有办法做到这一点?您似乎只能使用TimeSpan定义特定时间。

我想我可以为间隔的开始和结束定义两个TimeSpan,但我认为如果我可以定义间隔并使用它来直接比较它会节省大量时间。

4 个答案:

答案 0 :(得分:5)

首先,我不会使用DateTime.Now - 你几乎肯定会使用DateTime.UtcNow,假设你真的希望它是经过时间而不是当地时间的间隔。当地时间的间隔可能导致一些非常奇怪的行为,例如,如果你把它设置为当地时间01:45到02:15,那时钟在凌晨2点回来......

但除此之外,您可以将其定义为两个DateTimeDateTimeOffset值之间 - 我不会使用TimeSpan

或者,您可以使用已经定义https://github.com/scipy/scipy/blob/v0.16.0/scipy/ndimage/filters.py#L396类型的Noda Time项目...(而且,IMO,一般来说是一个更好的日期/时间API ...它会比较困难意外错误地使用Noda Time在间隔中使用本地值,例如)

答案 1 :(得分:2)

只需使用两个DateTime并检查它们。

答案 2 :(得分:1)

你可以创建一个这样的类:

class TimeInterval
{
  private DateTime start;
  private DateTime end;
  public TimeInterval(DateTime start, DateTime end)
  {
    this.start = start;
    this.end = end;
  }
  public bool Contains(DateTime moment)
  {
    return moment >= this.start && moment <= this.end;
  }
}

然后就这样使用它:

var interval = new TimeInterval(new DateTime(2015, 9, 23), new DateTime(2015, 9, 25));
interval.Contains(DateTime.Now);

但请确保您使用的所有DateTime都是sime类型(Local,Utc或Unspecified)。

答案 3 :(得分:1)

我自己没有提出这个问题而且我不记得我把它抬起来了,但我通常会使用这种结构:

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

以下是DateTime的具体版本:

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(DateTime.Today, DateTime.Today.AddDays(1));

range.Includes(DateTime.Now);

当然你可以使用相同的界面来定义各种类型的范围,但是DateTime主要是我用过的。