检查特定小时是否落入给定时间段的算法

时间:2010-03-01 12:39:03

标签: c# algorithm datetime

假设我有一个开始和停止时间,应该进行一些处理:

从20:00开始 结束07:00

现在检查某个DateTime小时值是否在此范围内的最佳算法是什么?提前谢谢!

请注意,上述开始和结束时间表明我们正在处理“夜间工作”。这意味着要检查的时间段从晚上20:00开始,到第二天早上07:00结束。

10 个答案:

答案 0 :(得分:6)

假设您只有时间而不是日期。

if end_time >= start_time:
    return start_time <= current_time <= end_time
else:
    return start_time <= current_time or current_time <= end_time

答案 1 :(得分:3)

如果您确定它是在同一天

你似乎也不关心秒

在几分钟内转换所有内容

startminute = 20 * 60 + 0
endminute = 7 * 60 + 0
eventminute = x * 60 + y // with event having the form xx:yy
return startminute < eventminute && eventminute < endminute 

另一种选择是以DateTime格式获得3次

DateTime start, end, event

return (start < event && event < end);

答案 2 :(得分:1)

假设你有一个开始,结束和现在的DateTime,你可以使用

bool within = start.TimeOfDay.TotalHours <= now.TimeOfDay.TotalHours && 
              now.TimeOfDay.TotalHours <= end.TimeOfDay.TotalHours;

答案 3 :(得分:0)

如果不知道如何在C#中执行此操作,我会将开始和结束时间转换为时间戳,然后进行简单的if (end time >= given time AND start time <= given time)比较。也许这会让你开始或者给你一个提示要搜索的内容。

答案 4 :(得分:0)

我认为c#支持DateTime变量的greater than / less than运算符,所以只说

if ((beginDateTime<myDateTime)&&(myDateTime<endDateTime))
{
    ...
}

也支持大于或等于,小于或等于。

答案 5 :(得分:0)

如果您拥有的是开始和停止的那些值,那么您是否有空集?

忽略明显的假设 - 开始第X天,结束日X + Y.

[编辑]
既然问题已被编辑,那么应该是答案....
对于开始时间,结束时间和“测试”时间从时期获得毫秒数(定义您想要的任何方式)
然后检查测试是否为&gt; = start和&lt; = end
[/编辑]

答案 6 :(得分:0)

使用一夜之间窗口,除了直接检查DateTime TimeOfDay对边界外,我认为没有什么特别聪明的事情:

using System;

namespace Question2355777
{
    class Program
    {    
        private static bool IsInOvernightWindow(
            DateTime dateTimeUnderTest, 
            TimeSpan morningEnd, 
            TimeSpan eveningStart)
        {
            TimeSpan timeOfDay = dateTimeUnderTest.TimeOfDay;
            return timeOfDay <= morningEnd || timeOfDay >= eveningStart;
        }

        static void Main(string[] args)
        {
            TimeSpan eveningStart = TimeSpan.FromHours(20);
            TimeSpan morningEnd = TimeSpan.FromHours(7);

            Console.WriteLine("{0} {1}", 
                DateTime.Today.AddHours(3),
                IsInOvernightWindow(
                    DateTime.Today.AddHours(3), 
                    morningEnd, 
                    eveningStart));

            Console.WriteLine("{0} {1}", 
                DateTime.Today.AddHours(12),
                IsInOvernightWindow(
                    DateTime.Today.AddHours(12), 
                    morningEnd, 
                    eveningStart));

            Console.WriteLine("{0} {1}", 
                DateTime.Today.AddHours(21),
                IsInOvernightWindow(
                    DateTime.Today.AddHours(21), 
                    morningEnd, 
                    eveningStart));

            Console.ReadLine();
        }
    }
}

产生

01/03/2010 03:00:00 True
01/03/2010 12:00:00 False
01/03/2010 21:00:00 True

答案 7 :(得分:0)

// initializing with some sample values
TimeSpan start = TimeSpan.FromHours(20);
TimeSpan end = TimeSpan.FromHours(7);
DateTime now = DateTime.Now.TimeOfDay;

return start<end
    ? start <= now.TotalHours && now.TotalHours <= end
    : start <= now.TotalHours || now.TotalHours <= end;

答案 8 :(得分:0)

使用TimeOfDay方法:

DateTime dtStart = new DateTime(0,0,0,20,0,0);
DateTime dtEnd = new DateTime(0,0,0,7,0,0);

if (DateTime.Now.TimeOfDay < dtEnd.TimeOfDay || DateTime.Now.TimeOfDay > dtStart.TimeOfDay)
{
    // your code here
}

答案 9 :(得分:0)

从开始日起以分钟为单位计算所有时间。

struct DateTime {
  uint_8 hour_;
  uint_8 minute_;
};

bool
isTimeWithin( DateTime start, DataTime stop, DateTime query ) {

  // The following times are counted from the beginning of start day

  uint_16 startInMins = (60 * start.hour_ + start.minute_);

  // Added 24*60 since "stop" is always "overnight" from "start"
  uint_16 stopInMins = 24 * 60 + (60 * stop.hour_ + stop.minute_); 

  // The ternary operator checks whether "query" is in the same day as
  // "start" or the next day
  uint_16 queryInMins = (query.hour_ < start.hour_ ? 24 * 60 : 0 ) + 
                           (60 * query.hour_ + query.minute_); 

  return ((startInMins <= queryInMins) && (queryInMins <= stopInMins));

}

编辑:改进格式化。