Windows服务正好在晚上11:59:59运行

时间:2016-02-29 16:24:31

标签: datetime timer windows-services

我正在编写一个Windows服务,它将在用户定义的时间将报告导出到Excel。用户可以选择使用以下选项运行报告:

  1. 选择StartTime和EndTime作为生成报告的时间
  2. 每日报道
  3. 每周报告
  4. 每月报告
  5. 年度报告。
  6. 注意(我的SQL Server数据每秒更新一次&我编写了一个Windows应用程序,用户将从中配置上面的,将保存到xml中)

    我的Windows服务配置为在TimerInterval 30000运行。

    我的问题是: 1.如果用户将开始时间设置为10:00 PM,将结束时间设置为12:00 AM,将每日时间设置为12:00 AM,则下面的代码将失败,因为我正在使用system.datetime.now

     DateTime tempDailyTime=DateTime.ParseExact(DailyTime,"HH:mm:ss tt",CultureInfo.InvariantCulture);
                        string curTime = System.DateTime.Now.ToString("HH:mm:ss tt");
                        DateTime tempCurrentTime = DateTime.ParseExact(curTime, "HH:mm:ss tt", CultureInfo.InvariantCulture);
                        if (tempCurrentTime >= tempDailyTime)
                        {
    
                            string tempFilename=Convert.ToString(tempDailyTime.TimeOfDay).Replace(":","-")+".xlsx";
                            if (!File.Exists(tempDir + "\\DailyTime" + "\\" + ReportName + "_" + tempFilename))
                            {
                                GenerateReportWithStartTimeandEndTime(ReportName,ReportID,ConnectionString,ReportColumnName,ReportBQuery,StartTime,EndTime,DailyTime,tempDir+"\\DailyTime",tempFilename);
                            }
                        }
    
    1. 用于生成每日,每周,每月,每年我已指定运行报告的预定时间

      DateTime scheduleTime = new DateTime(currentTime.Year,currentTime.Month,currentTime.Day,23,59,59,999);

    2. 在到达下面的代码部分之前经过计时器,如果datetime改变,它将生成一个空白报告。 我的每日报告生成代码如下:

       if (Daily == "true")
                          {
                              DateTime currentTime = DateTime.Now;
                              int intervalToElapse = 0;
                              DateTime scheduleTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 23, 59, 59, 999);
      
                              if (currentTime <= scheduleTime)
                                  intervalToElapse = (int)scheduleTime.Subtract(currentTime).TotalSeconds;
                              else
                                  intervalToElapse = (int)scheduleTime.AddDays(1).Subtract(currentTime).TotalSeconds;
      
                              _DailyTimer = new System.Timers.Timer(intervalToElapse);
                              if (_DailyTimer.Interval == 0)
                              {
                                  //GenerateDailyReport(ReportName, ReportID, ConnectionString, ReportColumnName, ReportBQuery, StartTime, EndTime, DailyTime, tempDir + "\\DailyTime", tempFilename);
                              }
      
                          }
                          if (Weekly == "true")
                          {
                              //GenerateWeeklyReport(ReportName, ReportID, ConnectionString, ReportColumnName, ReportBQuery, StartTime, EndTime, DailyTime, tempDir + "\\DailyTime", tempFilename);
                          }
                          if (Monthly == "true")
                          {
                              //GenerateMonthlyReport(ReportName, ReportID, ConnectionString, ReportColumnName, ReportBQuery, StartTime, EndTime, DailyTime, tempDir + "\\DailyTime", tempFilename);
                          }
                          if (Yearly == "true")
                          {
                              //GenerateYearlyReport(ReportName, ReportID, ConnectionString, ReportColumnName, ReportBQuery, StartTime, EndTime, DailyTime, tempDir + "\\DailyTime", tempFilename);
                          }
      

      要生成报告的数据来自以下xml文件:

      <?xml version="1.0" encoding="utf-8"?>
      <ArrayOfAutoReportXML>
        <AutoReportXML ReportName="oks" ReportID="64" ConnectionString="server='KHASIM-PC\SQLEXPRESS';uid='sa';pwd='khasim123';database='ReportMgr'" ReportBQuery="SELECT t1.id, t1.pt100, t1.pt200, t1.pt300, t1.inverter1, t1.voltage1, t1.power1, t1.inverter2, t1.voltage2, t1.power2, t1.cdt  FROM ab_Test t1 WHERE  t1.cdt BETWEEN @VALUE1 and @VALUE2" ReportColumnName="cdt" StartTime="18:00:00 PM" EndTime="22:00:00 PM" DailyTime="22:01:00 PM" Daily="true" Weekly="true" Monthly="true" Yearly="true" Loc="C:\Users\khasim\Desktop\testAutoGenerated" />
        <AutoReportXML ReportName="ShiftC" ReportID="63" ConnectionString="server='KHASIM-PC\SQLEXPRESS';uid='sa';pwd='khasim123';database='ReportMgr'" ReportBQuery="SELECT t1.id, t1.pt100, t1.pt200, t1.pt300, t1.inverter1, t1.voltage1, t1.power1, t1.inverter2, t1.voltage2, t1.power2, t1.cdt  FROM ab_Test t1 WHERE  t1.cdt BETWEEN @VALUE1 and @VALUE2" ReportColumnName="cdt" StartTime="22:00:00 PM" EndTime="06:00:00 AM" DailyTime="18:01:00 PM" Daily="true" Weekly="true" Monthly="true" Yearly="true" Loc="C:\Users\khasim\Desktop\testAutoGenerated" />
        <AutoReportXML ReportName="ShiftB" ReportID="62" ConnectionString="server='KHASIM-PC\SQLEXPRESS';uid='sa';pwd='khasim123';database='ReportMgr'" ReportBQuery="SELECT t1.id, t1.pt100, t1.pt200, t1.pt300, t1.inverter1, t1.voltage1, t1.power1, t1.inverter2, t1.voltage2, t1.power2, t1.cdt  FROM ab_Test t1 WHERE  t1.cdt BETWEEN @VALUE1 and @VALUE2" ReportColumnName="cdt" StartTime="14:00:00 PM" EndTime="22:00:00 PM" DailyTime="22:01:00 PM" Daily="true" Weekly="true" Monthly="true" Yearly="true" Loc="C:\Users\khasim\Desktop\testAutoGenerated" />
        <AutoReportXML ReportName="shiftA" ReportID="61" ConnectionString="server='KHASIM-PC\SQLEXPRESS';uid='sa';pwd='khasim123';database='ReportMgr'" ReportBQuery="SELECT t1.id, t1.pt100, t1.pt200, t1.pt300, t1.inverter1, t1.voltage1, t1.power1, t1.inverter2, t1.voltage2, t1.power2, t1.cdt  FROM ab_Test t1 WHERE  t1.cdt BETWEEN @VALUE1 and @VALUE2" ReportColumnName="cdt" StartTime="06:00:00 AM" EndTime="14:00:00 PM" DailyTime="14:01:00 PM" Daily="true" Weekly="true" Monthly="true" Yearly="true" Loc="C:\Users\khasim\Desktop\testAutoGenerated" />
        <AutoReportXML ReportName="testreport1" ReportID="59" ConnectionString="server='KHASIM-PC\SQLEXPRESS';uid='sa';pwd='khasim123';database='ReportMgr'" ReportBQuery="SELECT t0.testid, t0.pt500, t0.pt600, t0.cdt  FROM sampletest t0 WHERE  t0.cdt BETWEEN @VALUE1 and @VALUE2" ReportColumnName="cdt" StartTime="17:00:00 PM" EndTime="11:59:59 PM" DailyTime="00:01:00 AM" Daily="true" Weekly="true" Monthly="true" Yearly="true" Loc="C:\Users\khasim\Desktop\testAutoGenerated" />
        <AutoReportXML ReportName="testreport" ReportID="58" ConnectionString="server='KHASIM-PC\SQLEXPRESS';uid='sa';pwd='khasim123';database='ReportMgr'" ReportBQuery="SELECT t0.testid, t0.pt500, t0.pt600, t0.cdt  FROM sampletest t0 WHERE  t0.cdt BETWEEN @VALUE1 and @VALUE2" ReportColumnName="cdt" StartTime="09:00:00 AM" EndTime="17:00:00 PM" DailyTime="17:01:00 PM" Daily="true" Weekly="true" Monthly="true" Yearly="true" Loc="C:\Users\khasim\Desktop\testAutoGenerated" />
        <AutoReportXML ReportName="somereport" ReportID="57" ConnectionString="server='KHASIM-PC\SQLEXPRESS';uid='sa';pwd='khasim123';database='ReportMgr'" ReportBQuery="SELECT t0.testid, t0.pt500, t0.pt600, t0.cdt  FROM sampletest t0 WHERE  t0.cdt BETWEEN @VALUE1 and @VALUE2" ReportColumnName="cdt" StartTime="02:00:00 AM" EndTime="05:37:47 AM" DailyTime="06:37:47 AM" Daily="True" Weekly="True" Monthly="True" Yearly="True" Loc="C:\Users\khasim\Desktop\testAutoGenerated">57</AutoReportXML>
      </ArrayOfAutoReportXML>
      

      我需要建议如何处理这个或我做错了什么。

0 个答案:

没有答案