2009-02-26 100 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!!! 
相關問題