1

私は毎日特定の時刻にプロセスを実行しています (米国では重要です)。私は25時間の1日でそれを正しく行う方法を計算しようとしています. 次の C# コードを検討してください。

var referenceDate = new DateTime(2012, 11, 3);
var referenceTime = new TimeSpan(0, 19, 30, 0);
var originalTime = referenceDate.Add(referenceTime);
var tomorrow = referenceDate.AddDays(1);
var nextTimestamp = string.Format(
            "{0} {1:00}:{2:00}", 
            tomorrow.ToShortDateString(), 
            referenceTime.Hours, 
            referenceTime.Minutes);
var nextRunTimestamp = DateTime.Parse(nextTimestamp);

フォーマット/パース シーケンスを使用して、DST 移行時間を超えるときにタイム スパンを回避できるようにしました。次の式の結果はどうなるでしょうか。

nextRunTimestamp.Subtract(originalTime).TotalHours

24 であることが判明しましたが、2012 年 11 月 4 日は 25 時間制なので (午前 2 時に移行)、11 月 3 日の 19:30 と 11 月 4 日の 19:30 の差は 25 になるはずです。 25時間になります。

年の各日付の正しい答えを得るにはどうすればよいですか?

4

1 に答える 1

3

実際には、それを行う必要はまったくないようです。毎日同時に何かを実行している場合、時間の変更に合わせて自動的に調整されるため、問題はかなり無意味に思えます。

ただし、本当に興味がある場合は、次を利用して特定の年のDaylightTimeを取得できます。

var dst = TimeZone.CurrentTimeZone.GetDaylightChanges(2012);

DaylightTime オブジェクトには、タイムゾーンに関係なく、DST の開始日時と終了日時があります。そこから、必要に応じて、DST の開始または終了が期間内にあるかどうかを確認し、必要に応じて 1 時間を加算または減算することができます。

次に、コードに次のようなロジックを含めることができます (疑似コード):

if(dst.End > originalTime && dst.End < tomorrow)
    //Add hour for "25 hour" day

if(dst.Start > orginalTime && dst.Start < tomorrow)
    //Subtract hour for "23 hour" day

編集:あなたがしていたことを誤解したと思います。ただし、上記のコードは、DST の開始または終了が期間内にあるかどうかを示します。あなたはこれを探しています:

//Probably DateTime.Now, but whatever
var referenceDate = new DateTime(2012, 11, 3, 19, 30, 0);
var nextTime = referenceDate.AddDays(1);

Timer t = new Timer(nextTime.ToUniversalTime() - referenceDate.ToUniversalTime());

t.Start();

DateTime を文字列形式にしてから、実際のコードで Parse を実行しようとしていないことを願っています...

于 2012-11-07T18:58:02.137 に答える