我已经在C#中研究了如何做到这一点,我一直在调度任务,但是,我不知道这是否是我需要的。这就是我想出来的
void MainPage_Loaded(Object sender, RoutedEventArgs e)
{
tomorrowAt8AM = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.AddDays(1).Day, 8, 0, 0);//This is always 'tomorrow' at 8 am.. I think.
TimeSpan timeSpan = tomorrowAt8AM.Subtract(DateTime.Now);
timer.Interval = timeSpan;
timer.Tick += new EventHandler(timerTick);
queryDB();
timer.Start();
}
private void timerTick(object sender, EventArgs e)
{
queryDB();
//Recalculate the time interval.
tomorrowAt8AM = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.AddDays(1).Day, 8, 0, 0);//This is always 'tomorrow' at 8 am.. I think.
TimeSpan newTimerInterval = tomorrowAt8AM.Subtract(DateTime.Now);
timer.Interval = newTimerInterval;
}
我们的想法是从“现在”到“明天早上8点”找出它是多少,并将该时间跨度设置为新的计时器间隔。在我的脑海里,这是有效的..有更好的方法来做到这一点?是否需要重新启动计时器,因为我改变了它的间隔?
@Richard Deeming这是一段代码,用于测试1月31日的情况。
System.DateTime tomorrowAt8AM = new System.DateTime(DateTime.Now.Year, 2, 1, 8, 0, 0);//This is always the 'next' day at 8 am.
while (true)
{
DateTime temp = new DateTime(DateTime.Now.Year, 1, 31, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
DateTime now = DateTime.Now;
System.TimeSpan diff1 = tomorrowAt8AM.Subtract(temp);
//Console.WriteLine(diff1.Days);
Console.WriteLine("Days: {3}, Hours: {0}, Minutes: {1}, Seconds: {2}", diff1.Hours, diff1.Minutes, diff1.Seconds, diff1.Days);
Thread.Sleep(1000);
}
当我执行此代码时,它似乎正确地记下来......你确定在月底会出现问题吗?
答案 0 :(得分:2)
“明天上午8点”的代码错误。考虑1月31日发生的事情:
// DateTime.Now == 2013/01/31
// DateTime.Now.AddDays(1) == 2013/02/01
tomorrowAt8AM = new DateTime(2013, 1, 1, ...
您还需要考虑daylight-saving time会发生什么。当时钟前进时,您的代码将在上午9点执行。当他们回去时,它将在早上7点执行。为避免这种情况,您应该使用DateTimeOffset type:
DateTimeOffset tomorrowAt8AM = Date.Today.AddDays(1).AddHours(8);
TimeSpan interval = tomorrowAt8AM.Subtract(DateTimeOffset.Now);
更改DispatcherTimer时,Interval property会自动更新计时器。你不需要重新启动计时器。
查看MSDN上的评论,计时器不能保证在上午8点开始计时:
定时器不能保证在时间间隔发生时准确执行,但保证在时间间隔发生之前不执行。
您需要测试代码,看看计时器是否足够准确,符合您的要求。