2017-09-13 11 views
0

私は、ユーザーが特定の日付のイベントをスケジュールできるようにするシステムを作成しようとしています。タイムゾーンを考慮している間だけ、日付の保存はどうすればできますか?

サーバー側では、毎日午前3時に実行されるSQLジョブがあります。

クライアント側では、ユーザーがdatepickerで日付を選択しています。

SQLジョブが、ユーザーが保存してユーザーのタイムゾーンにある任意の日にアクションを実行する日付を確認できるようにする必要があります。

私は、次の(ラフC#の擬似コード)を格納しようとしました:

DateTime scheduledDateUtc = ConvertToUTC(dateEnteredByUser.Date, usersTimezone).Date; 

私は、SQLジョブで、次の比較に基づいてイベントを実行します。

WHERE CONVERT(DATE, scheduled_date_utc) = CONVERT(DATE, GETUTCDATE()) 

これは上の障害が発生していますいくつかのエッジケースと間違いなく間違っていますが、私は正しい戦略が何であるか分かりません。

さらに、これらのエッジケースの単体テストをどのように書くべきかはわかりません。

ありがとうございます!

+0

のようにそれを設定しようとするだろう。コンピュータのローカルタイムゾーン設定が自動的に調整されます。 DateTimeオブジェクトは、自動的にすべてのコンピュータのUTC時刻に保存され、UTC時刻(文字列を使用しない場合)でPCとデータベース間で転送されます。したがって、変換は必要ありません。 – jdweng

+0

「失敗する」とはどういう意味ですか?あなたの現在のコードはどのようなエラーを生成しますか? –

+1

@jdweng SQLの列の種類によって異なります。 'DateTime'と' DateTime2'は、 'DateTimeOffset'が実行する間、タイムゾーン情報を持っていません。 「DateTime」列を使用する場合、ユーザー入力は[UTCに最初に変換](https://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx)にする必要があります。 – Romoku

答えて

0

UTCに変換する必要がありますか?代わりに、手動でUTCに変換し、私はあなたがタイムゾーンを心配する必要はありませんので、

DateTime scheduledDateUtc = DateTime.SpecifyKind(dateEnteredByUser.Value, DateTimeKind.Utc);

+0

これは、ユーザーが極端なタイムゾーンに近づいた場合に問題を引き起こす可能性があります。すなわちUTC + 12またはUTC-11である。 – user3722952

関連する問題