2009-02-26 97 views
21

我有一项服务,用户可以配置在“非高峰”时段运行。他们有能力设置服务可以运行的时间范围。如何检查当前时间是否在一段时间内?

例如:

用户A工作8点至晚5,所以他们要安排应用到下午5:30和7:30之间运行。

用户B的工作时间是下午9点到凌晨6点,因此他们安排应用程序在上午6:30到下午8:30之间运行。

问题是,应用程序使用他们的电脑,而他们没有。

给定当前时间的DateTime,开始的DateTime和停止时间的DateTime,如何检查当前是否在开始和停止之间。

对我来说,棘手的部分是时间可以穿越午夜的边界。

回答

44

如果startTimeendTime表示单个时间间隔(它只会发生一次,startTimeendTime表示日期和开始/停止的时间),那么它的话说

bool isTimeBetween = someTime >= startTime && someTime <= endTime; 

如果那么容易这是一个反复发生的事件(每隔一段时间发生一次),您可以使用TimeOfDay属性进行比较。 (反复出现的情况是一个,你必须考虑启动/停止跨越午夜)

static public bool IsTimeOfDayBetween(DateTime time, 
             TimeSpan startTime, TimeSpan endTime) 
{ 
    if (endTime == startTime) 
    { 
     return true; 
    } 
    else if (endTime < startTime) 
    { 
     return time.TimeOfDay <= endTime || 
      time.TimeOfDay >= startTime; 
    } 
    else 
    { 
     return time.TimeOfDay >= startTime && 
      time.TimeOfDay <= endTime; 
    } 

} 

(注:此代码假定如果start == end,那么它涵盖了所有的时间,您所提出的意见,以这种效果。在另一个岗位)

例如,要检查它是否是早上5时至9:30 PM

IsTimeOfDayBetween(someTime, new TimeSpan(5, 0, 0), new TimeSpan(21, 30, 0)) 

如果startTimeendTimeDateTime秒之间,你可以说

IsTimeOfDayBetween(someTime, startTime.TimeOfDay, endTime.TimeOfDay) 
+0

开始时间和结束时间的日期时间也没有时间跨度 – scottm 2009-02-26 20:23:20

+0

在我的应用程序 – scottm 2009-02-26 20:36:16

1

我假设你在应用程序配置文件中保存了开始和结束时间,所以你基本上必须做的就是让你的应用程序在“开始时间”发生时设置一个标志“on”在停止时间发生时将其设置为“关闭”。

这样,您不必经常检查“now”是否是“开始与结束”之间的时间。

0

如果(电流> =启动& &当前< =停止)

(或不=)

我认为这是你所需要的?

午夜边界是一条红色的鲱鱼 - 所有你需要知道的是两个比较的状态。

如果你做不同的事情来处理周末,那么你有其他的逻辑,但基本的比较很简单。

2

所以我从这个问题假设你想知道是否给了一天的开始时间和结束时间(不包括实际日期,即1/1/1900或类似的东西),看看是否有另一个时间与开始和结束所指定的时间一致。例如,如果开始时间为晚上9点,结束时间为早上9点,则接受晚上10点但拒绝上午10点。

你可以做到这一点无论每一次的范围类型(​​时间相等,端的是开始之后,到底是开始之前),这是简单的:

if (end==start) return true 
else if (end>start) return start<=time && time<=end 
else return !(time>end && time<start) 

,也可以扩展的开始和结束等的范围为此总是后开始为这样:

if (end<=start) end += <24 hours> 
if (time<start) time+= <24 hours> 
return time<=end 
-1
DateTime t1; 
t1 = DateTime.Now; 

// loop inbetween start and end time  

if (t1>=start_time &&t1<=end_time) 

{ 
    //your code/action 
} 

//if you are using sql to get values 

start_time = Convert.ToDateTime(row.Cells[10].Text); 
end_time = Convert.ToDateTime(row.Cells[11].Text); 
//convert them to string or you will get some error!!! 
相关问题