2009-08-01 89 views
2

我有去如下要求(相信我,我是太舊了功課笑容計算任務開始時間

我有一堆與各種頻率運行的任務。他們也有一個開始「種子」日期/時間。開始的種子是過去的某個時間,可能是一分鐘前,可能是五年前。

我需要使用開始種子日期/時間和頻率來計算任務的下一次運行時間 - 它不能簡單地是「現在」+任務頻率(對於那些在MS SQL上安排任務的人服務器這是一個熟悉的概念)

現在這樣做的愚蠢做法是採取開始種子,並不斷增加頻率,直到它變得比「現在」更大。這並不是最佳。要做到這一點的幼稚方法是採取開始種子日期,將其更改爲今天的日期並保持原樣,然後添加頻率直到比現在更大,但假定頻率是24小時的倍數。

那麼最好/最快的方法是什麼? C#解決方案的附加點,但是這足夠通用,可以爲任何語言製作有趣的謎題:)

回答

6

更好的方法是將開始時間戳和當前時間戳之間的差值除以頻率,將得到的乘數四捨五入到最接近的整數,再乘以頻率,並再次將其添加到開始時間戳。

四捨五入的行爲將提供適當的抵消。

+0

這簡直就是黑魔法。驚人。 – 2014-08-15 13:37:03

0

你的回答將基本上是這樣的:

next_time = ceiling((now - seed)/frequency) * frequency + seed 

使用吊頂功能保證:NEXT_TIME將> =現在。

你必須做必要的轉換,以便能夠執行上的日期該算法(例如,轉換爲UNIX時間,這是秒數自1月1日,1970年)

我不熟悉用C#,所以我不能提供代碼,但我認爲C#具有處理日期/時間算術運算的日期/時間實用程序類。

+0

你有一個額外的權利,在頻率之後。 – 2009-08-01 07:51:50

0

有趣的益智,感謝這應該做它在C#中的挑戰:)

。幾乎可以肯定地減少,但它的詳細足以解釋發生了什麼事情。

// Initialise with date the event started, and frequency 
DateTime startDate = new DateTime(2009, 8,1,9,0,0); 
TimeSpan frequency = new TimeSpan(0, 15, 0); 

// Store datetime now (so that it doesnt alter during following calculations) 
DateTime now = DateTime.Now; 

// Calculate the number of ticks that have occured since the event started 
TimeSpan pastTimeSpan = now.Subtract(startDate); 

// Divide the period that the event has been running by the frequency 
// Take the remaining time span 
TimeSpan remainingTimeSpan = new TimeSpan(pastTimeSpan.Ticks % frequency.Ticks); 

// Calculate last occurence the event ran 
DateTime lastOccurence = now.Subtract(remainingTimeSpan); 

// Calculate next occurence the event will run 
DateTime nextOccurence = lastOccurence.Add(frequency);