【发布时间】:2013-11-09 00:56:25
【问题描述】:
我正在尝试向我的程序添加一个功能,该功能将在芝加哥期货市场收盘后每天执行代码。这意味着我想在东部时间 5:35 左右(市场所在的中部时间 4:35)运行代码。随着夏令时的发生,这当然会在 EST (UTC -5) 和 EST (UTC -4) 之间来回切换。
我知道有很多类似的问题,但似乎没有一个提供我可以使用的解决方案。主要建议似乎是使用任务计划程序或 Quartz,但是,我无法在我的程序中实现这些。我认为最有希望的解决方案是使用TimeZoneInfo、DateTime 和TimeSpan 的组合来安排每天在正确时间触发的计时器。我目前的解决方案是这样的:
DateTime now = DateTime.Now;
DateTime currentDateTime = now.DateTime.Date;
DateTime expiryDateTime = currentDateTime
.AddHours(17)
.AddMinutes(35)
.AddDays(
now.DateTime.Hour >= 18 + utcOffset
|| (now.DateTime.Hour == 17 && now.DateTime.Minute >= 35) ? 1 : 0);
Timer timer = new Timer(
...,
null,
expiryDateTime - DateTime.Now,
...);
但是,如果我的代码在东部时间以外的时区运行,我认为这将分崩离析。我还担心当时区从 EST 切换到 EDT 时,这在 23 或 25 小时的日子里不会正常运行,反之亦然。
有没有比我目前正在做的更好的方法来处理日程安排?如何使这段代码更健壮,以处理在任何时区运行但始终在东部时间同时执行?
编辑:如上所述,Task Scheduler 和 Quartz 不是选项。 Quartz 退出了,因为我无法包含第三方库。任务计划程序已退出,因为我需要从我的程序中访问大量内部值。启动另一个应用程序并将这些值暴露给该应用程序会增加比我认为的优点更多的复杂性。
【问题讨论】:
-
The primary suggestions seem to be to use the Task Scheduler or Quartz, however, I am unable to implement those in my program.,请问为什么?是因为没有足够的文档来满足您的需要吗? 更具体地说,为什么不能使用 Quartz? -
只需将所有程序状态存储在配置文件或数据库中,这样任务调度程序就不需要传入或知道任何相关信息。
-
我同意服务。此外,可能存在代码异味,因为即使您需要通过 DB,您也应该有一个可重用的 DL,这样事情就变得简单了。