2

次のような要件があります (信じてください、私は宿題をするには年を取りすぎています にやにや)

さまざまな頻度で実行されるタスクがたくさんあります。また、開始の「シード」日付/時刻もあります。開始シードは過去のある時点で、1 分前、5 年前などです。

開始シード日時と頻度を使用して、タスクの次の実行時間を計算する必要があります。単純に「現在」とタスクの頻度を足すことはできません (MS SQL Server でジョブをスケジュールした場合、これはおなじみのコンセプト)

これを行う愚かな方法は、開始シードを取得し、「現在」よりも大きくなるまで周波数を追加し続けることです。それはほとんど最適ではありません。それを行う単純な方法は、開始シード日を取得し、それを今日の日付に変更して時間をそのままにしてから、現在よりも大きくなるまで頻度を追加することですが、頻度が 24 時間の倍数であることを前提としています。

では、これを行うための最良/最速の方法は何ですか? C# ソリューションのボーナス ポイントですが、これはどの言語でも興味深いパズルを作成するのに十分一般的です :)

4

3 に答える 3

6

より良い方法は、開始タイムスタンプと現在のタイムスタンプの差を取り、それを頻度で割り、結果の乗数を最も近い整数に丸め、再び頻度を掛けて、それを開始タイムスタンプにもう一度追加することです。

切り上げの行為は、適切なオフセットを提供します。

于 2009-08-01T07:37:07.343 に答える
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);
于 2009-08-01T09:00:56.113 に答える
0

あなたの答えは本質的にこれです:

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

天井関数を使用すると、next_time が >= now になります。

日付に対してこの算術演算を実行できるようにするには、必要な変換を行う必要があります (たとえば、1970 年 1 月 1 日からの秒数である UNIX 時間に変換します)。

私は C# に詳しくないので、コードを提供することはできませんが、C# には日付/時刻の算術演算を処理するための日付/時刻ユーティリティ クラスがあると思います。

于 2009-08-01T07:44:06.593 に答える