3

プロジェクトの概要を説明するために、ユーザーがログインしてイベントをスケジュールできるASP.NETWebFormアプリケーションがあります。イベント処理は、私がWindowsサービスを作成したローカルWindowsサーバーによって処理およびディスパッチされます。

東海岸からログインするクライアントと西海岸からログインするクライアントがいることを除いて、すべてが正常に機能しています。

誰かがタイムゾーンの違いを処理する方法について可能なワークフローを提案できますか?タイムゾーン情報は、各クライアントとともにデータベースにすでに保存されています。タイムゾーン情報を適用する方法について混乱しています。

私は方法がDateTimeあることを知っていますが、それがどのように機能するかについて私を混乱させます。なぜなら、それを普遍的な時間に変換できるようにするには、構造がどのToUniversalTime()タイムゾーンにあるかを知る必要があるように思われるからです。構造にタイムゾーン情報が組み込まれていません。DateTimeDateTime

誰かが私にこれを説明してもらえますか?

4

3 に答える 3

1

イベントが1回DateTimeOffset発生するようにスケジュールされている場合は、、またはUTCとして保存するのが理にかなっていDateTimeます。として保存する場合DateTimeOffsetでも、関連するオフセットを使用してユーザーに表示できます。実際、他のタイムゾーンのユーザーには、現地時間として、または元のユーザーの現地時間として、それが視聴者の現地時間と同じではありません(私が言っていることがわかる場合)。

再発する場合(たとえば、「毎日午前4時」)、DSTの変更が考慮されないため、それだけでは不十分です。代わりに、現地時間とタイムゾーン識別子を保存する必要があります。TimeZoneInfo.Idおよびを参照してくださいTimeZoneInfo.FindSystemTimeZoneById

露骨なプラグとして、組み込み型のかなり表現力豊かな代替手段としてNodaTimeAPIを使用することを検討することをお勧めします...

システムタイムゾーン(つまり、サーバー)を使用するため、ほぼ確実にを使用しないでください。これは、ほぼ確実に無関係である必要があります。DateTime.ToUniversalTime()

于 2012-11-01T15:17:33.660 に答える
0

MSDNから:

ToUniversalTimeメソッドは、DateTime値を現地時間からUTCに変換します。非ローカルタイムゾーンの時刻をUTCに変換するには、TimeZoneInfo.ConvertTimeToUtc(DateTime、TimeZoneInfo)メソッドを使用します。UTCからのオフセットがわかっている時刻を変換するには、ToUniversalTimeメソッドを使用します。

.NET Frameworkバージョン2.0以降、ToUniversalTimeメソッドによって返される値は、現在のDateTimeオブジェクトのKindプロパティによって決定されます。

DateTimeのデフォルト値Kindは指定されていないため、日付は現地時間と見なされます。

于 2012-11-01T15:18:24.167 に答える
0

私たちは同様のアプリケーションに取り組んできました。TimeZoneOffsetとScheduledTimeをデータベーステーブルに保存します。クライアント側では、TimeZOneOffset(分単位)は夏時間を考慮に入れます。次のように計算されます。

    Dim localZone As TimeZone = TimeZone.CurrentTimeZone 
    Dim StartTime As DateTime = UserEnteredStartDateTime 'from your web app
    Dim TimeZoneOffset As Integer = localZone.GetUtcOffset(StartTime).TotalMinutes

サーバー上のストアドプロシージャには、次のように、スケジュールされた開始時間と30秒のウィンドウ内にある行を選択するwhere句が含まれています。

SELECT Invitations.ID, Invitations.OrganizerName, Invitations.OrganizerEmail, Invitations.EMailBody, Invitations.[Subject]
FROM Invitations 
WHERE (Invitations.MailSent=0) 
And (Invitations.SendTime Between DateAdd(mi,Invitations.TimeZOneOffset,GETUTCDATE()) 
And DateAdd(s,(Invitations.TimeZoneOffset*60)+30,GETUTCDATE())) 
于 2012-11-01T15:36:12.203 に答える