【问题标题】:Find if current time falls in a time range查找当前时间是否在时间范围内
【发布时间】:2009-10-01 15:02:53
【问题描述】:

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


【解决方案1】:

用于检查一天中的使用时间:

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
}

【讨论】:

  • 如何统计匹配数?例如,我想计算该范围内有多少个星期六和星期日。
  • @pmbiesiada:这完全超出了原始问题(和答案)的范围。您应该将此作为一个新问题,但如果之前已经回答过类似的问题,请在此处对 SO 进行搜索。祝你好运。
  • 如果不同的日子有不同的时间怎么办?有没有容易比较的? stackoverflow.com/questions/22769557/…
  • @SearchForKnowledge:比较什么?请更具体地说明您想要完成的任务或提供一些示例。
  • 下面的答案应该是公认的答案...这个答案不会在几天内检查 TimeSpan,例如从 22:00:00 到 02:00:00...
【解决方案2】:

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

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

请注意,在此示例中,时间边界包含在内,并且仍假定 startstop 之间的时间差小于 24 小时。

【讨论】:

  • 如果不同的日子有不同的时间怎么办?有没有容易比较的? stackoverflow.com/questions/22769557/…
  • 好点,这是有道理的。如果测量的时间经过午夜,那么这将是唯一仍然正确的答案。
  • 谢谢你,下班后我尝试了11:57 pm 并且成功了:TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
  • 谢谢你。答案似乎很简单,但概念化有点尴尬。
  • 这是一个很好的答案。我正在编写一种方法来确定给定DateTime 的时间是否在指定的营业时间内。营业时间可以在同一天,但也可以跨越两天(例如,营业时间下午 3 点至凌晨 1 点)。
【解决方案3】:

一个简单的小扩展函数:

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

【讨论】:

  • 安德烈的补充。不会考虑对不同日期的情况进行 OR 比较。
  • 一小段代码很棒,但有一个问题。如果您指定相同的开始和结束时间会怎样。一个假设是,这可能意味着它应该跨越 24 小时,这意味着您检查start &lt;= end 的条件应该更改为start &lt; end,另一个假设可能是它在同一天,但如果是这种情况,如果您使用 Now.TimeOfDay 可能会失败,因为它包含毫秒并导致超出范围。
  • @Thierry Nice catch :) 欢迎您尝试修复它。
  • 另一个需要考虑的变体是将两个 time &lt;= end 更改为 time &lt; end
【解决方案4】:
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);
【解决方案5】:

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

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

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

Here is where I got that example of using TimeRange

【讨论】:

  • TimeRange 不是任何 C# 库中的类。它是一个外部类,可以在上面的链接中下载。
【解决方案6】:

TimeOfDay property 返回一个 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

【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

        我们不希望我们的服务在夜间运行。 所以我们创建了这个条件来检查当前时间在上午 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.
        }
        

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:
             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");
                    }
            
                }
             }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-05
              • 2012-11-22
              • 2011-09-08
              相关资源
              最近更新 更多