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

问题描述 投票:0回答:13

使用.NET 3.5

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

到目前为止我有当前时间:

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

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

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

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

c# datetime timespan
13个回答
326
投票

检查一天中的使用时间:

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
}

176
投票

这里有一些很好的答案,但没有涵盖您的开始时间与结束时间不同的情况。 如果您需要跨越一天的界限,那么这样的事情可能会有所帮助:

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
stop
之间的差异小于 24 小时。


28
投票

一个简单的小扩展函数:

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

18
投票
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");

16
投票

尝试使用 C# 中的 TimeRange 对象来完成您的目标。

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

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

这是我使用 TimeRange 的示例


9
投票

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() 函数的末尾。


1
投票

这对于处理日边界情况会更简单吗? :)

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 ... 
}

1
投票

4次检查

public static void GetTime()
        {
            var dt =  DateTime.Now;
            int hours = dt.Hour;
            int min = dt.Minute;

            if (hours >= 1 && hours <= 12)
            {
                //Good Morning
            }
            else if (hours >= 12 && hours <= 16)
            {
                //Good Afternoon
            }
            else if (hours >= 16 && hours <= 21)
            {
                //Good Evening
            }
            else if (hours >= 21 && hours <= 24)
            {
                //Good Night
            }
        }

0
投票

我们不希望我们的服务在夜间运行。 因此,我们创建了这个条件来检查当前时间是否在上午 9 点(今天)和凌晨 1 点(第二天)的时间窗口内:

if (DateTime.Now > DateTime.Now.Date && DateTime.Now <= DateTime.Now.Date.AddHours(1.00) || 
DateTime.Now >= DateTime.Now.Date.AddHours(9))
{
 // Current Time is within specified time window.
}

0
投票

.NET 6 起,您可以使用

TimeOnly
结构来实现此目的:

TimeOnly.FromDateTime(DateTime.Now).IsBetween(
    TimeOnly.Parse("12:00"), 
    TimeOnly.Parse("13:00"));

注意,只有版本之间包含才有效,所以你不能以 1 分钟为单位更改间隔边界。


-1
投票

使用 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))

-2
投票
 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");
        }

    }
 }
© www.soinside.com 2019 - 2024. All rights reserved.