时间检查跨越2天

时间:2013-09-25 08:34:10

标签: c# datetime timespan

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

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

1 个答案:

答案 0 :(得分: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);