我正在嘗試爲我的程序添加一個功能,該功能將在芝加哥期貨市場關閉後每天執行代碼。這意味着我想在東部時間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小時內不會正常工作,反之亦然。
有沒有比我目前正在處理調度更好的方法?我怎樣才能讓這段代碼更健壯,可以處理在任何時區運行,但始終在東部時間執行?如上所述,任務計劃程序和Quartz不是選項。石英出來了,因爲我無法包含第三方庫。任務計劃程序已經關閉,因爲我需要從我的程序中訪問很多內部值。啓動另一個應用程序並將這些值公開給該應用程序增加了比我認爲的更好的複雜性。
'主要的建議似乎是使用任務計劃程序或然而,Quartz,我無法在我的程序中實現這些。「,請問爲什麼?是否因爲沒有足夠的文檔來滿足您的需求? **更具體地說,爲什麼不能使用Quartz?** –
只需將所有程序狀態存儲在配置文件或數據庫中,以便任務調度程序不需要將其傳入或知道任何事情。 – Servy
我同意服務。此外,可能的代碼異味,因爲即使你需要通過DB,你應該有一個可重用的DL,所以事情保持簡單。 –