首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Timers.Timer与夏时制

System.Timers.Timer与夏时制
EN

Stack Overflow用户
提问于 2015-11-02 22:06:35
回答 1查看 983关注 0票数 0

我有一些计时器从表中读取HH:MM:SS,以确定何时每天运行。

例如:

定时器A需要每周一13:00运行

计时器B需要每周二02:00运行

计时器C需要每小时运行一次

因此,在我的代码中,我知道当前时间是什么,然后计算从DateTime.Now()到下一个计时器应该运行的毫秒。当计时器的Elapsed事件完成后,它将重新计算它应该在何时下一个运行。由于时间的变化,这在这个周末造成了一个问题。

有更好的方法吗?DateTime.UtcNow会是一个更好的选择吗?可以将数据库中的时间字符串转换为UTC时间,然后计算出DateTime.UtcNow()而不是DateTime.Now()之间的区别。

EN

回答 1

Stack Overflow用户

发布于 2015-11-03 13:50:46

你可以做几件事来解决这个问题。

一种是将UTC用于所有计划好的工作。这给您提供了一个健壮、可预测的系统,不会带来许多复杂的问题或测试负担。但夏季星期一的作业将在冬天的02:00进行。如果可以的话,UTC的策略是好的。

(测试时区切换用例是件痛苦的事,如果您将UTC用于任何事情,您的测试负担就会减少。)

另一种方法是认真对待你的约会算法,并且要非常小心。即使在转换日期,C#的DateTime类也能很好地完成日期运算。

因此,假设您需要在周日01:30每周运行一次流程。在美国的噩梦时刻..。它不会发生在春季的转换中,在秋季的转换中会发生两次。但您仍然希望进程只运行一次。

您要做的是:保留一个“下一个预定时间”值。每次运行作业时,计算下一次运行的“下一个计划时间”值。这可能是这样的:

代码语言:javascript
复制
var today = DateTime.Today.AddDays(7); /* midnight a week from now */
TimeSpan runTime = TimeSpan.Parse("01:30");
var nextRun = today + runTime;

然后,保存nextRun DateTime值。稍后,您可以知道离下一次运行还有多长时间。这是个很好的方法。还有其他人。

代码语言:javascript
复制
var msUntilNextRun = (nextRun.Ticks - DateTime.Now.Ticks) / 10000;

如果msUntilNextRun值显示得相当小且为正值,则可以睡觉,直到运行的时候。如果是小的和负的,你就睡过头--马上跑(睡过头是很常见的)。

将天数添加到当前的午夜值,然后添加时间,然后计算等待时间,这是一种即使在转换日期也能获得合理运行时的方法。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33487893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档