Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法用C#来定义时间间隔?_C#_.net - Fatal编程技术网

有没有办法用C#来定义时间间隔?

有没有办法用C#来定义时间间隔?,c#,.net,C#,.net,我想定义一个时间间隔,并检查System.DateTime.Now是否在该时间间隔内。有办法吗?似乎您只能使用TimeSpan定义特定的时间 我想我可以为时间间隔的开始和结束定义两个时间间隔,但如果我可以定义时间间隔并直接使用它进行比较,我认为这可以节省很多时间。只需使用两个日期时间并对照它们进行检查。首先,我不会使用DateTime。现在-您几乎肯定应该使用DateTime.UtcNow,假设您真的希望它是经过的时间间隔而不是本地时间。当地时间的间隔可能会导致一些非常奇怪的行为,例如,如果您将

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


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

只需使用两个日期时间并对照它们进行检查。

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

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


或者,您可以使用我的项目,它已经定义了一个类型。。。(在我看来,这是一个更好的日期/时间API……例如,使用Noda time为间隔使用本地值会比较难出错)

您可以创建如下类:

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

但是,请确保您使用的所有日期时间都是sime类型(本地、Utc或未指定)。

我不是自己想到的,也不记得是从哪里提出来的,但我通常使用这种结构来处理这类事情:

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

当然,您可以使用相同的界面为各种类型定义范围,但DateTime主要是我使用它的目的。

使用
TimeSpan
作为开始和结束听起来很奇怪。你在找“每天早上9点到10点”之类的东西吗?
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);