我正在尝试向我的程序添加一个功能,该功能将在芝加哥期货市场收盘后每天执行代码。这意味着我想在东部时间 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 不是 options。Quartz 退出了,因为我无法包含第三方库。任务计划程序已退出,因为我需要从我的程序中访问大量内部值。启动另一个应用程序并将这些值暴露给该应用程序会增加比我认为的优点更多的复杂性。