C#日期更改时使用计时器的轮班计划

C#日期更改时使用计时器的轮班计划,c#,timer,C#,Timer,我正在尝试编写一个C#form应用程序,作为轮班时间表。用户可以输入开始时间、中断时间和停止时间,每个时间包含小时和分钟部分。 该程序将保持每天24小时不间断运行,并且每次到达设定时间时,都需要显示一条消息。例如,如果开始时间是6:00,休息时间是10:00,停止时间是14:00,那么每天在这些时间,屏幕应该分别显示消息“开始”、“休息”和“完成”。当然,一旦休息结束,它会再次显示“开始”。当当前时间不在轮班时,它需要不断地说“完成”。如果轮班在同一天开始和停止,我的程序工作正常。但是,如果班次

我正在尝试编写一个C#form应用程序,作为轮班时间表。用户可以输入开始时间、中断时间和停止时间,每个时间包含小时和分钟部分。 该程序将保持每天24小时不间断运行,并且每次到达设定时间时,都需要显示一条消息。例如,如果开始时间是6:00,休息时间是10:00,停止时间是14:00,那么每天在这些时间,屏幕应该分别显示消息“开始”、“休息”和“完成”。当然,一旦休息结束,它会再次显示“开始”。当当前时间不在轮班时,它需要不断地说“完成”。如果轮班在同一天开始和停止,我的程序工作正常。但是,如果班次包括日期更改(例如,开始-20:00、休息-23:00、结束-3:00等),则当前时间变为午夜时会出现混乱

我有check_during_shift方法检查当前时间是否在开始和停止时间范围内,还有check_shift_end_same_day方法检查轮班是否在同一天开始和结束

private TimeSpan start;
private TimeSpan breakBegin;
private TimeSpan breakEnd;
private TimeSpan stop;
private TimeSpan current;
//The timer runs every second
private void timer_Tick(object sender, EventArgs e){
  //set each TimeSpan variables
  start = TimeSpan.Parse(startHour + ":" + startMinute);
  //same way for breakBegin, breakEnd, and stop (not written on here)
  current = DateTime.Now.TimeOfDay;

  //if current time is NOT during the shift time
  if(check_during_shift(start, stop, current) == false){
      /* display "done" message */
  }
  //currently during the shift
  else{
     //this shift starts and ends in the same day
     if(check_shift_end_same_day(start, stop) == false){
       //add one day for the times that are on the next day 
       TimeSpan nextDay = new TimeSpan(1, 0, 0, 0); //1 day timeSpan
       if(start > breakBegin){
         //add one day to breakBegin, breakEnd, and stop
         breakBegin = breakBegin.Add(nextDay);
         breakEnd = breakEnd.Add(nextDay);
         stop = stop.Add(nextDay);
       }
       if(breakBegin > breakEnd){
         /*similarly, add one day to breakEnd and stop*/
       }
       if(breakEnd > stop){
         /*similarly, add one day to stop*/
       }
     }

     //check if current time fits somewhere in the time range
     if(current >= start && current < breakBegin){
        /*display "start" message*/
     }
     else if(current >= breakBegin && current < breakEnd){
        /*display "break" message*/
     }
     else if(current >= breakEnd && current < stop){
        /*display "start" message*/
     }
  }
}

private void check_during_shift(TimeSpan start, TimeSpan stop, TimeSpan current){
  if(start <= stop){
     if(current >= start && current <= stop) return true;
     else return false;
  }
  else{
     if(current >= start || current <= stop) return true;
     else return false;
  }
}

private void check_shift_end_same_day(TimeSpan start, TimeSpan stop){
   if(start <= stop) return true;
   else return false;
}
private TimeSpan启动;
私人时间间隔开始;
专用时间间隔中断端;
私人时间间隔站;
私人时间跨度电流;
//计时器每秒运行一次
私有无效计时器(对象发送方、事件参数){
//设置每个TimeSpan变量
start=TimeSpan.Parse(startHour+“:”+startMinute);
//breakBegin、breakEnd和stop的方式相同(此处未注明)
当前=DateTime.Now.TimeOfDay;
//如果当前时间不在轮班时间内
如果(在换档过程中检查(启动、停止、电流)=false){
/*显示“完成”消息*/
}
//目前正在轮班
否则{
//这班在同一天开始和结束
如果(检查\u班次\u结束\u当天(开始、停止)=false){
//为第二天的时间添加一天
TimeSpan nextDay=新的TimeSpan(1,0,0,0);//1天TimeSpan
如果(开始>中断开始){
//为中断开始、中断结束和停止添加一天
breakBegin=breakBegin.Add(nextDay);
breakEnd=breakEnd.Add(下一天);
停止=停止。添加(下一天);
}
如果(断开开始>断开结束){
/*同样,在breakEnd和stop中添加一天*/
}
如果(断开>停止){
/*同样,增加一天停止*/
}
}
//检查当前时间是否符合时间范围内的某个位置
如果(当前>=开始和当前<中断开始){
/*显示“开始”信息*/
}
else if(当前>=breakBegin&¤t=断开和当前<停止){
/*显示“开始”信息*/
}
}
}
移位期间的专用无效检查(时间间隔开始、时间间隔停止、时间间隔当前){

如果(start=start&¤t=start | | current)您没有给我们任何修改日期的代码,所以很难说。修改日期?最后一次编辑会有帮助。如果您需要更多代码,请告诉我。如果有帮助,我愿意展示我所有的代码