0

我正在创建一个 Windows 服务,它检查文件夹、其他服务等。如果其中任何一个出现故障,则发送警报短信。但是,我对在给定时间段内(从晚上 23 点到早上 7 点)收到警报消息不感兴趣。

该服务是通过 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。

4

1 回答 1

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:00 - 07:00 之间的任何时间都被认为是“静默”时期,即

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);
于 2013-09-25T08:50:15.807 回答