时间检查跨越 2 天

本文关键字:跨越 检查 时间 | 更新日期: 2023-09-27 18:32:39

我正在创建一个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。

时间检查跨越 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);