4

スケジューラ アプリケーションがあります。このアプリケーションを使用すると、ユーザーは次の 30 日間、毎日午前 8 時 PT に実行するようにタスクをスケジュールできます。さまざまなタイムゾーンのユーザーがいるため、時刻を UTC に変換してデータベースに保存します。次の関数を使用して、時刻を UTC に変換します。

public static DateTime ToAccountLocalTime(this DateTime dt)
{
    return TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("user time zone"));
}

ユーザーが 2012 年 11 月 1 日の次の 30 日間、毎日午前 8 時 (PT) にタスクを実行するようにスケジュールした場合、データベースでは 30 日ごとに 30 のエントリが作成され、時間は UTC の午後 4 時に設定されます (上記で返されるように)。方法)。

問題が発生したのは、夏時間が終了した 11 月 4 日です。スケジューラ サービスは常に UTC に基づいて実行されるため、タスクは午前 8 時ではなく午前 7 時に実行を開始しました。

これを解決するには、上記のメソッドで 11 月 1 日から 11 月 3 日までの日付の場合は午後 4 時 (UTC)、11 月 4 日以降の日付の場合は午後 3 時 (UTC) を返す必要があります。これを実現するには、どのような変更を行う必要がありますか?

4

2 に答える 2

0

30 日ごとに変換を行う必要があるため、 , = ..ToUtcのそれぞれに対して呼び出し (または、質問に貼り付けたルーチンの反対が呼び出されたもの) を呼び出し、それらの結果を保存します。localDate.AddDays(n)n130

ToUtcが次のように定義されている場合:

return TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("user time zone"));

指定された時刻に DST に対応する必要があります。(あいまいな時間や無効な時間の例外に注意してください。)

于 2012-11-13T00:59:01.553 に答える
0

現地時間が重要な場合は、現地時間 + タイムゾーンを保存し、UTC が必要なときに UTC に変換します。

次に、午前 8 時 PT を保存すると、現在 DST であるかどうかに応じて、UTC の午後 3 時または午後 4 時に変換されます。

発生する問題は、データベースによって異なります。タイムゾーンがサポートされていない場合があります。に渡す文字列をおそらく保存しますFindSystemTimeZoneById。より凝ったものにしたい場合は、ID 列を持つそれらすべてをリストするテーブルを作成し、ID を格納できます。

于 2012-11-12T13:46:38.350 に答える