有没有办法在c#中定义一个时间间隔?

本文关键字:一个 时间 定义 有没有 | 更新日期: 2023-09-27 18:14:22

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

我想我可以为间隔的开始和结束定义两个TimeSpan但是我认为如果我可以直接定义间隔并使用它直接进行比较的话可以节省很多时间

有没有办法在c#中定义一个时间间隔?

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

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

或者,你可以使用我的Noda时间项目,它已经定义了一个Interval类型…(在我看来,这是一个更好的日期/时间API…如果不小心在使用局部值来表示间隔(例如,使用Noda Time)

使用两个DateTimes并对照它们进行检查。

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

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);

但是要确保你使用的所有DateTimes都是同一类型的(Local, Utc或Unspecified)

这不是我自己想出来的,我也不记得是在哪里提出来的,但我通常在这类事情上使用这个结构:

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。