查找当前时间是否在某个时间范围内


146

使用.NET 3.5

我想确定当前时间是否在某个时间范围内。

到目前为止,我有currentime:

DateTime currentTime = new DateTime();
currentTime.TimeOfDay;

我正在研究如何转换和比较时间范围。这行得通吗?

if (Convert.ToDateTime("11:59") <= currentTime.TimeOfDay 
    && Convert.ToDateTime("13:01") >= currentTime.TimeOfDay)
{
   //match found
}

UPDATE1:谢谢大家的建议。我对TimeSpan函数不熟悉。



3
您是否需要担心午夜过境?
gjutras

1
午夜时分不是问题,但跨越午夜的任何事情都肯定会损害我的编程经验……
John M

Answers:


258

要检查一天中的时间,请使用:

TimeSpan start = new TimeSpan(10, 0, 0); //10 o'clock
TimeSpan end = new TimeSpan(12, 0, 0); //12 o'clock
TimeSpan now = DateTime.Now.TimeOfDay;

if ((now > start) && (now < end))
{
   //match found
}

对于绝对时间,请使用:

DateTime start = new DateTime(2009, 12, 9, 10, 0, 0)); //10 o'clock
DateTime end = new DateTime(2009, 12, 10, 12, 0, 0)); //12 o'clock
DateTime now = DateTime.Now;

if ((now > start) && (now < end))
{
   //match found
}

如何计算比赛次数?例如,我要计算范围内的星期六和星期日。
pbies 2013年

@pmbiesiada:这完全超出了原始问题(和答案)的范围。您应该提出一个新问题,但是如果以前已经回答过类似问题,请在此处进行讲授。祝好运。
Frank Bollack 2013年

1
如果不同的日子有不同的时间怎么办?有比较容易的方法吗?stackoverflow.com/questions/22769557/...
SearchForKnowledge

@SearchForKnowledge:比较什么?请更具体地说明您要完成的工作或提供一些示例。
Frank Bollack 2014年

4
下面的答案应该是被接受的答案。。。这个答案不会检查几天内的TimeSpans,例如从22:00:00到02:00:00 ...
FranzHuber17年

117

这里有一些很好的答案,但没有一个涵盖您的开始时间与结束时间不在同一天的情况。如果您需要跨越日期界限,则可以使用以下方法:

TimeSpan start = TimeSpan.Parse("22:00"); // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");   // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

if (start <= end)
{
    // start and stop times are in the same day
    if (now >= start && now <= end)
    {
        // current time is between start and stop
    }
}
else
{
    // start and stop times are in different days
    if (now >= start || now <= end)
    {
       // current time is between start and stop
    }
}

请注意,在此示例中,时间范围是包括在内的,并且仍然假定start和之间的时间差小于24小时stop


1
如果不同的日子有不同的时间怎么办?有比较容易的方法吗?stackoverflow.com/questions/22769557/...
SearchForKnowledge

好点,这是有道理的。如果测得的时间经过了午夜,那么这将是唯一仍然正确的答案。
Sunsetquest

1
谢谢你,我努力尝试了几个小时之后11:57 pm,这个方法起作用了: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut 2015年

1
谢谢你 答案似乎很简单,但是在概念上有点尴尬。
山姆我说恢复莫妮卡

这是一个很好的答案。我正在写一种方法来确定给定时间是否DateTime在指定的工作时间内。营业时间可以在同一天,但也可以跨越两天(例如,下午3点至凌晨1点营业时间)。
提请

17
if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >=  currentTime.TimeOfDay)
{
   //match found
}

如果您真的想将字符串解析为TimeSpan,则可以使用:

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");

谢谢你,我努力尝试了几个小时之后11:57 pm,这个方法起作用了: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut 2015年

16

一个简单的小扩展功能:

public static bool IsBetween(this DateTime now, TimeSpan start, TimeSpan end)
{
    var time = now.TimeOfDay;
    // If the start time and the end time is in the same day.
    if (start <= end)
        return time >= start && time <= end;
    // The start time and end time is on different days.
    return time >= start || time <= end;
}

3
很好的安德烈。不会考虑针对不同日期的情况进行“或”比较。
大卫

3
很少的代码,但是有一个问题。如果您指定相同的开始和结束时间,该怎么办。一个假设是,这可能意味着它应该跨越24小时,这意味着您的条件start <= end应更改为检查条件,start < end而另一个假设可能是它是在同一天,但是如果是这样,则如果您使用Now.TimeOfDay,因为它包含毫秒,并导致超出范围。
蒂埃里

@Thierry Nice catch :)欢迎您尝试修复它。
安德烈·史尼德·科克(AndréSnede Kock)

14

尝试在C#中使用TimeRange对象以完成目标。

TimeRange timeRange = new TimeRange();
timeRange = TimeRange.Parse("13:00-14:00");

bool IsNowInTheRange = timeRange.IsIn(DateTime.Now.TimeOfDay);
Console.Write(IsNowInTheRange);

这是我使用TimeRange的示例


12
TimeRange不是任何C#库中的类。它是一个外部类,可以从上面的链接下载。
2012年

6

TimeOfDay属性返回一个TimeSpan值。

尝试以下代码:

TimeSpan time = DateTime.Now.TimeOfDay;

if (time > new TimeSpan(11, 59, 00)        //Hours, Minutes, Seconds
 && time < new TimeSpan(13, 01, 00)) {
    //match found
}

另外,new DateTime()与相同,DateTime.MinValue并且始终等于1/1/0001 12:00:00 AM。(值类型不能具有非空的默认值)要使用DateTime.Now


2

您非常接近,问题在于您正在将DateTime与TimeOfDay进行比较。您需要做的是将.TimeOfDay属性添加到Convert.ToDateTime()函数的末尾。


2

这样处理日界案例会更简单吗?:)

TimeSpan start = TimeSpan.Parse("22:00");  // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");    // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

bool bMatched = now.TimeOfDay >= start.TimeOfDay &&
                now.TimeOfDay < end.TimeOfDay;
// Handle the boundary case of switching the day across mid-night
if (end < start)
    bMatched = !bMatched;

if(bMatched)
{
    // match found, current time is between start and end
}
else
{
    // otherwise ... 
}

0

使用Linq,我们可以通过此简化

 Enumerable.Range(0, (int)(to - from).TotalHours + 1)
            .Select(i => from.AddHours(i)).Where(date => date.TimeOfDay >= new TimeSpan(8, 0, 0) && date.TimeOfDay <= new TimeSpan(18, 0, 0))

0
 using System;

 public class Program
 {
    public static void Main()
    {
        TimeSpan t=new TimeSpan(20,00,00);//Time to check

        TimeSpan start = new TimeSpan(20, 0, 0); //8 o'clock evening

        TimeSpan end = new TimeSpan(08, 0, 0); //8 o'clock Morning

        if ((start>=end && (t<end ||t>=start))||(start<end && (t>=start && t<end)))
        {
           Console.WriteLine("Mached");
        }
        else
        {
            Console.WriteLine("Not Mached");
        }

    }
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.