假设我有一个开始和停止时间,应该进行一些处理:
从20:00开始 结束07:00
现在检查某个DateTime小时值是否在此范围内的最佳算法是什么?提前谢谢!
请注意,上述开始和结束时间表明我们正在处理“夜间工作”。这意味着要检查的时间段从晚上20:00开始,到第二天早上07:00结束。
答案 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));
}
编辑:改进格式化。