2016-04-14 6 views
0

私はちょっと混乱して正しいアプローチをしています。utcとしてユーザが選択した日付を保存し、utcフィールドを使用してdbに対してクエリを実行します

私のアプリは、異なるタイムゾーンを持つ場所(イベントの所有者)がそれとやりとりすることを意味するグローバルアプリです。私は物事を単純にしたいと思います。

私のアプリでは、場所(イベントの所有者)が(明らかにdatetimeを選んで)カレンダーにイベントを作成してからdbに保存することができます。 (StartDateTime、EndDateTime)

ユーザー(イベント出席者)は、イベントの近くで発生したイベントを表示します。

私がこれまで行ってきたことは、自分のテーブルにStartDateTimeUTC、EndDateTimeUTCという2つのフィールドを作成し、各ユーザーがデフォルトのtimezoneidを設定できるようにしました。

新しいイベントを作成するとき、私は自分のタイムゾーンを読んで、彼らはUTC

TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); //gotten from db 

DateTime startDateTimeUserSelected = new DateTime(2016, 4, 14, 2, 15, 0); //user picked from a datetimepicker 
DateTime endDateTimeUserSelected = new DateTime(2016, 4, 14, 4, 15, 0); //user picked from a datetimepicker 

var starDateTimeUTC = TimeZoneInfo.ConvertTimeToUtc(startDateTimeUserSelected, tz); 
var endDateTimeUTC = TimeZoneInfo.ConvertTimeToUtc(endDateTimeUserSelected, tz); 

に選択した日時を変換それから私は偉大な、私のデシベルフィールドににそれらを保存するには、今、私は私のユーザーは、UTCとして日付を選択してしまったし、 dbに保存されます。

今、私は今日起こるが、私は(自分のタイムゾーンに基づいて)現在のユーザのローカルタイムを取得するために必要なすべてのイベントのためのDBを照会する

var currentTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz); //tz being read from db for particular user 

そして私はCURRENTTIMEを使用することができます今日起こっているすべてのイベントのために私のdbを見つけて照会してください。

ただ、アプリの 場所は、彼らのユーザーのためのイベントを作成します(場所は世界のどこでも可能)バックエンドを使用して、自分の携帯電話にアプリを使用して、ユーザーが自分の周りの異なる場所で起こっているかのイベントを表示します(同じタイムゾーン)

質問 これは、夏時間を心配することなくタイムゾーンを処理する正しい方法ですか?または、現地時間に基づいてユーザーにイベントを表示し、すべてを同期させておくアプリのために、もっと多くのことをする必要がありますか?

またはすべてをUTCなしで保存し、DBから照会する場所(イベントの所有者)のブラウザからユーザーの現在の日時を判断し、イベントを編集/追加する必要があります。また、モバイルデバイスからユーザー(出席者)の時間を判断します。

私がUTCに行く場合は、プレイスと出席者の両方のタイムゾーンを把握し、すべての比較がUTC経由で行われていることを確認してください。

NONE utcとしてすべてを入力しても、ブラウザ/モバイルデバイスのいずれかからCURRENT DATETIMEユーザーを読み取る必要があるということ以外の変換については心配する必要はありません。

私は何かを見逃しましたか?

答えて

-1

Azureテーブルストレージ(NOSQL)で作業していたとき、ATSは常にすべての日付時刻フィールドをUTCとして保存するので、この同じロードブロックが発生しました。私は3つのフィールドしていたデータベースのテーブルの上に

:目標は、UTCを使用して、端末のローカル時間を計算しないように

TerminalUtcTime DATETIME TerminalTimezone CHAR(6) TerminalLocalTime CHAR(12)

をし、タイムゾーン。 日照時間(夏時間)などの影響はではないため、は、タイムゾーンに と同様にUTC時刻を反映していません。

私の経験上、非常に厳しい銀行のWebサービスに端末の現地時間を転送する必要がありました。できるだけ正確なデータを送信する必要がありました。文字列としてTerminalTimezoneとterminalLocalTimeなどあなただけのTerminalUtcTimeとしてterminalUtcTimeを保存する必要が

、 terminalTimezone:

クライアントで

:サーバー上

DateTime terminalUtcTime = DateTime.Now.ToUniversalTime(); 
string terminalTimeZone = // Get from TimeZoneInfo.Local and format to ±hh:mm like +08:45 or -10:00 (format varies on how you may want it to be) 
// Getting the timezone can be tricky because the hh and mm separator can be changed in the control panel so I had to use substrings instead 
DateTime terminalLocalTime = DateTime.Now.ToLocalTime(); 

terminalLocalTime.ToString("yyyyMMddHHmmssfff"); // Saves up to the milliseconds 

ここで、必要に応じて、端末の現地時間のDateTimeインスタンスを取得できます。私はDateTime.ParseExact(var、 "yyyyMMddHHmmssfff");を使用して計算する必要はありません。

はい、テーブルに新しいフィールドを追加する必要がありますが、すべての心配を節約できます。これは、UTC時間のみを許可するデータベース上のアプローチですが、UTC以外の時間を保存できるMySql、MSSQLなどを使用している場合は、それもあなたのために働く可能性があり、すべてのトラブルをセーブします。

+0

端末(サーバ時間)は私にとって重要ではありません。私が心配する唯一の日付は、ユーザが選択したイベントの日付だけです。そのデータを使用して現在の日付に基づいてイベントをユーザに提示します私があなたの答えを誤解しない限り、ローカルに関連するものが私にとって重要であるかどうかを確かめてください。 – Zoinky

+0

@Zoinkyクライアントの国コードを使ってあなたのアプリに表示されるイベントをフィルタリングして、私にとっては理にかなっているのはなぜですか。したがって、同じ国のすべてのクライアントは、サマータイムなどの影響を気にせずに同じイベントを表示します。 –

関連する問題