2013-09-25 77 views
0

我正在創建一個windows服務,用於檢查文件夾,其他服務等。併發送警報文本消息,如果其中任何一個停止。但是,我並不想在特定時間段(從23.00晚上到07.00早上)獲取警報消息。跨越2天的時間檢查

該服務通過XML配置文件進行設置,可以預定義該靜默期。

我需要一種方法來檢查服務是否在一段時間內運行,所以它會掛起文本消息。該服務每5分鐘檢查一次,因此我無法弄清楚在這些檢查過程中如何應對日子的轉移。

要闡述:

我當前的代碼:

bool silende = false; 
DateTime silenceModeFrom = new DateTime(
    DateTime.Now.Year, 
    DateTime.Now.Month, 
    DateTime.Now.Day, 
    int.Parse(doc.XPathSelectElement(
     "//SurveilanceServiceConfig/SilenceModeTimeFrom").Value), 
    00, 
    00); 

DateTime silenceModeTo = silenceModeFrom.AddHours(
    int.Parse(doc.XPathSelectElement(
     "//SurveilanceServiceConfig/SilenceModeTimeHours").Value)); 

if (DateTime.Now > silenceModeFrom && DateTime.Now < silenceModeTo) 
{ 
    silence = true; 
} 

在這段代碼中,檢查工作,如果它是24.00之前提出的,但不能作爲後等DateTime.Now.Day,將是第二天。所以從理論上講,代碼只會驗證沉默期爲每天23.00到24.00。

+0

爲什麼你不能解決這個問題?通過轉移日期,你的意思是什麼?請更具體! –

+0

您能否詳細說明「*我無法弄清楚如何應對天移*」 - 一天不轉移。時間的確基於DST之類的東西。 – James

+0

你嘗試了什麼?與編寫Windows服務和XML配置相比,檢查DateTime.Now的時間組件是否大於23:00或小於07:00,然後不做某事似乎很基本。 – nvoigt

回答

2

你是不是已經不遠了......

有一個輕微問題與您的代碼,因爲它代表,每次你打電話DateTime.Now時間會改變 - 你需要捕獲實例服務被觸發的時間,即

var instant = DateTime.Now; 
DateTime silenceModeFrom = new DateTime(instant.Year, instant.Month, instant.Day, int.Parse(doc.XPathSelectElement("//SurveilanceServiceConfig/SilenceModeTimeFrom").Value), 00, 00); 
DateTime silenceModeTo = silenceModeFrom.AddHours(int.Parse(doc.XPathSelectElement("//SurveilanceServiceConfig/SilenceModeTimeHours").Value)); 
bool silence = instant.TimeOfDay >= silenceModeFrom.TimeOfDay && instant <= silenceModeTo; 

雖然看着這段代碼,但你的時間窗口看起來是錯誤的。你對這裏的Date真的不感興趣 - 這只是時間。因此,任何東西之間23:00hrs - 07:00hrs被認爲是「沉默的」期間即

int curHour = DateTime.Now.Hour; 
int silenceStartHour = int.Parse(doc.XPathSelectElement("//SurveilanceServiceConfig/SilenceModeTimeFrom").Value); 
int silenceEndHour = int.Parse(doc.XPathSelectElement("//SurveilanceServiceConfig/SilenceModeTimeHours").Value); 
bool silence = curHour > silenceStartHour || curHour < silenceEndHour; 

的邏輯,用於確定是否是在靜音週期可以稍微改進以考慮這是所有的範圍有一天,或者是午夜時分的範圍。

bool silence = silenceStartHour <= silenceEndHour 
    ? (curHour >= silenceStartHour && curHour < silenceEndHour) 
    : (curHour >= silenceStartHour || curHour < silenceEndHour); 
+0

您是對的。這使事情變得非常簡單。謝謝。 – MartinChristensen

+0

非常接近,但如果沉默範圍在一天中間而不是午夜過渡,這將不起作用。最後一行需要一些額外的邏輯。另外,開始應該使用'> ='來包容。 –

+0

@MattJohnson在開始的好處不是包容性的,結束小時也應該是包容性的(我在第一個例子中有這個)。但是,我不確定爲什麼你認爲如果它在同一天內不會工作?例如,如果我的開始時間是'9',而我的結束時間是'17',那麼'9:00 - 17:00'之間的任何內容都將被忽略 - 除非我缺少明顯的東西... – James