C# Timer 整点用法问题

时间:2023-01-30 22:05:40
我想让我的Timer,在程序启动时做一次操作,然后每逢整点的时候做一次操作。
比如,我早上8:30启动程序,在这一时刻Timer做一次操作,然后在9:00,10:00,11:00,12:00 等等,都做一次操作。
我之前代码如下,我是用Interval=3600000,这样也只是从启动程序时,让后退1小时而已。
public FormMain()
        {
            InitializeComponent();
            Timer1.Start();
        }
 private void Timer1_Tick(object sender, EventArgs e)
        {
           do();
            Timer1.Interval = 3600000;
        }

请问各位C# 大神,如何解决这个问题啊。。。
C# 新手跪谢!!!

10 个解决方案

#2


public FormMain()
        {
            InitializeComponent();
             this.Init_Timer();
            Timer1.Start();
        }
       private Timer Timer1 = new Timer();
 private void Timer1_Tick(object sender, EventArgs e)
        {
            Timer1.Interval = 3600000;
           Timer1.Tick += new EventHandler(do);
        }

#3


设置个变量
int OldHour;
判断
if(datetime.now.hour!=OldHour)
{
OldHour=datetime.now.hour;
//这里写你的代码
}

#4


你可以设两个timer,第一个timer间隔一分钟那样子用于计算当前时间到整点数,第二个timer时间间隔一小时用于你的程序真正的整点数时运行。
程序刚开始运行的时候,启动的时候可能是任意时间,这时你先运行第一个timer,判断当前时间是不是整点,不是的话一分钟之后继续判断,当到达整点数时候,第一个timer stop掉,然后开始start第二个timer即可。

或者如果你的是想让一个程序在整点数时执行的话不用timer直接用windows的任务计划好了。

#5


将timer的interval设置小一点,一分钟左右
然后在tick里判断当前系统时间,是否是整点
是,就执行你的代码

#6


 void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        try
        {
            DateTime time = e.SignalTime;
            //每天的10:50干活
            if (time.Hour == 10 && time.Minute == 50 && time.Second == 0)
            {
                //DoSomething
            }
        }
        catch
        {
            throw;
        }
    }
请参考

#7


C# Timer 整点用法问题 做成windows服务把

#8



      
public FormMain()
         {
             InitializeComponent();
             Timer1.Interval = 3600000;
             Timer1.Start();
         }
  private void Timer1_Tick(object sender, EventArgs e)
         {
           if( (long)DateTime.Now.TimeOfDay.TotalSeconds  % 3600 == 0)
           {
               //do some
           }
             
         }


#9



bool isFirst  = true;
public FormMain()
        {
            InitializeComponent();
            Timer1.Start();
            Timer1.Interval = 60000;
            do();
        }
 private void Timer1_Tick(object sender, EventArgs e)
        {
           do();            
        }
private void do()
{
 bool canDo = false;
  if(isFirst)
  {
    canDo = true;
    isFirst = false;
  }
 else
 {
  Datetime cDate = Datetime.Now;
  if(cDate.Minutes == 0)
  {
    canDo = true;
  }
 }
  if(!canDo) return;
//do something
}

#10


之前正好有一个类似的例子,不过是Winform中的timer,不过原理相似

    private System.Windows.Forms.Timer time1 = new System.Windows.Forms.Timer();
      
        public Form1()
        {
            InitializeComponent();

            //do something

            //计算到下一个整点还有多少时间
            time1.Interval = 60 * 60 * 1000 - DateTime.Now.Minute * 60000 - DateTime.Now.Second * 1000 - DateTime.Now.Millisecond;
            time1.Tick += new EventHandler(DoSomething);
            time1.Start();
        }

        private void DoSomething(Object myObject, EventArgs myEventArgs)
        {
            //你想做的事
            time1.Interval = 60000;
        }


#1


#2


public FormMain()
        {
            InitializeComponent();
             this.Init_Timer();
            Timer1.Start();
        }
       private Timer Timer1 = new Timer();
 private void Timer1_Tick(object sender, EventArgs e)
        {
            Timer1.Interval = 3600000;
           Timer1.Tick += new EventHandler(do);
        }

#3


设置个变量
int OldHour;
判断
if(datetime.now.hour!=OldHour)
{
OldHour=datetime.now.hour;
//这里写你的代码
}

#4


你可以设两个timer,第一个timer间隔一分钟那样子用于计算当前时间到整点数,第二个timer时间间隔一小时用于你的程序真正的整点数时运行。
程序刚开始运行的时候,启动的时候可能是任意时间,这时你先运行第一个timer,判断当前时间是不是整点,不是的话一分钟之后继续判断,当到达整点数时候,第一个timer stop掉,然后开始start第二个timer即可。

或者如果你的是想让一个程序在整点数时执行的话不用timer直接用windows的任务计划好了。

#5


将timer的interval设置小一点,一分钟左右
然后在tick里判断当前系统时间,是否是整点
是,就执行你的代码

#6


 void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        try
        {
            DateTime time = e.SignalTime;
            //每天的10:50干活
            if (time.Hour == 10 && time.Minute == 50 && time.Second == 0)
            {
                //DoSomething
            }
        }
        catch
        {
            throw;
        }
    }
请参考

#7


C# Timer 整点用法问题 做成windows服务把

#8



      
public FormMain()
         {
             InitializeComponent();
             Timer1.Interval = 3600000;
             Timer1.Start();
         }
  private void Timer1_Tick(object sender, EventArgs e)
         {
           if( (long)DateTime.Now.TimeOfDay.TotalSeconds  % 3600 == 0)
           {
               //do some
           }
             
         }


#9



bool isFirst  = true;
public FormMain()
        {
            InitializeComponent();
            Timer1.Start();
            Timer1.Interval = 60000;
            do();
        }
 private void Timer1_Tick(object sender, EventArgs e)
        {
           do();            
        }
private void do()
{
 bool canDo = false;
  if(isFirst)
  {
    canDo = true;
    isFirst = false;
  }
 else
 {
  Datetime cDate = Datetime.Now;
  if(cDate.Minutes == 0)
  {
    canDo = true;
  }
 }
  if(!canDo) return;
//do something
}

#10


之前正好有一个类似的例子,不过是Winform中的timer,不过原理相似

    private System.Windows.Forms.Timer time1 = new System.Windows.Forms.Timer();
      
        public Form1()
        {
            InitializeComponent();

            //do something

            //计算到下一个整点还有多少时间
            time1.Interval = 60 * 60 * 1000 - DateTime.Now.Minute * 60000 - DateTime.Now.Second * 1000 - DateTime.Now.Millisecond;
            time1.Tick += new EventHandler(DoSomething);
            time1.Start();
        }

        private void DoSomething(Object myObject, EventArgs myEventArgs)
        {
            //你想做的事
            time1.Interval = 60000;
        }