2011-08-04 5 views
2

になるために私たちは現在、基本的に、我々は現在、私たちは迷っている時間間隔で実行できるタスク、日付、特定の時間などなどなどんDaylightsaving時間原因のDateTime計算は負

を予定している、当社のサービスの中核をrewrittingていますデイライトセービングが問題を引き起こす可能性がある場合は、基本的に、タスクを実行する曜日と、時間と間隔を考慮して、次に実行可能なランタイムを計算します。これを行うには、現在の時刻を取得し、このDateTimeに日/分/時間を追加します。

次に、この新しい実行時間をとり、このDateTimeからDateTime.Nowを減算して、次の実行まで時間を残します。

現在の時刻が昼間の01:50の場合、設定された間隔である20分を追加し、02:10の時刻で終了します。これは昼食禁止ですから、実際には01:10です。

01:10(実際には02:10)から現在の時刻(01:50)を引いたとき、これは負の値を返します。これは回避する必要があります。負の値を返すことはありません。 DateTimeは適切な情報を保持しているだけで長いですか?

基本的に、次のコードは、チェックが必要かどうかですか?

//Get interval between nextrun and right now! 
double interval = (NextRun - DateTime.Now).TotalMilliseconds; 

//Check if interval is ever less or equal to 0, should never happen but maybe with daylight saving time? 
if(interval <= 0) 
{ 
    //Set default value 
    interval = IntervalInMilliseconds; 
} 

この検査は不要であると考えていますが、これまでの調査では明確な答えは得られていません。それはあなたがそれがどのように動作するかを理解するのに役立ちますよう

+0

私はこれに遅刻していることを知っていますが、必要な間隔でサービス/ cronジョブを実行するようにOSに依頼してください。プログラムをよりシンプルにすることができたようです(つまり、日付の情報を扱うことはできません。起動したときはいつでも実行することを前提としていました)。これが考慮されなかったか、うまくいかない理由はありましたか? – ray

答えて

4

代わりにDateTime.Nowの使用DateTime.UtcNowがEVERYWHERE

+0

これは問題を引き起こしませんか?タスクを20:00〜05:00に実行する場合は、 UtcNowを使用すると、タスクは1時間実行されません。または、これはどのように動作するのでしょうか? –

+0

私が間違っている、はい、UtcNowに変更すると、すべての問題を解決するだろう –

+0

実際には、より正確には、我々はすべての設定は、現地時間で行われているか、これまで、UTCを使用するように計算を変更しました。これらの現地時間はUtcに変更されます。これは、我々はまだdaylightsavingの問題で立ち往生することなく、右の時間を実行するために、私たちのスケジュールを設定することができました。 –

0

まず第一に、あなたはそれを自分で試すことができます。

基本的には、上記の例を使用して、現地時間で20分の場合、計算は現地時間で行われるため1:10ではなく2:10になります。 1:10を取得する場合は、現地時間を世界時に変換し、20分を追加してから現地時間に戻す必要があります。

実際の経過時間が必要な場合は、時差を計算する前に世界時に変換する必要があります。また、現地時間で作業する場合、クロックが戻ったときのあいまいな時間を区別することができません。

+0

ここではいくつかのadditionnalのリンクは以下のとおりです。 [ファイブ.NET開発者の一般的なサマータイムアンチパターン](http://codeofmatt.com/2015/03/06/common-daylight-saving-time-mistakes-for-net-あなたは、任意のタイムゾーンをサポートしたい場合は、開発者/) – Phil1970

+0

は、その後、私はあなたが 'DateTimeOffset'toが正しく、すべてのケースを処理する必要があると思います。そうでなければ、DateTime' 'と、曖昧な時間を指定することは問題であろうが正しく(それは本質的に標準時間であるとして処理される)は、ほとんどの場合には時間を処理することが可能です。そのためには、現時点でのDateTimeのメンバ変換を使用する必要があります。**このように、現在のタイムゾーンのみを処理する必要があり、 UTC時間で保存されますが、現地時間として表示されます。** – Phil1970