2013-03-20 18 views
7

MVC4 C#アプリケーションでは、アプリケーションでオブジェクトが作成されたときにDateTime.Nowを使用しました。展開後、ローカルコンピュータとホスティングの間に+8時間の差がありました。それから、DateTime.UtcNowに変更しました。違いは-4時間です。私のコンピュータの日付で例えば ローカル時刻とサーバー時刻に違いがあります

20 Mar 2013, 14:28:12ですが、日付を格納 20 Mar 2013, 10:28:12.

のようなデータベースに私は何をすべきすべての国のすべてのユーザーが1と同じ日付を使用するには?

編集:私の時間帯は、(UTC + 04:00)であるサーバーには、次のされバクーPST

+4

これは@JonSkeetのためのものです、彼は日時の質問を愛しています:) – mattytommo

+0

Hmm。それが接続されているかどうかを尋ねる人ではありませんが、サーバーの日付/時刻は正しいですか?少なくとも、それはあなたの箱のものと一致しますか? – FrankieTheKneeMan

+0

ALSO:サーバーはどのタイムゾーンに、どのタイムゾーンにいますか? – FrankieTheKneeMan

答えて

3

たとえば、ユーザーがニューヨーク(GMT-5)に、サーバーがインドにある(GMT + 5:30)としましょう。

ユーザーが「ローカル」時刻を午前10時(EST)と見なすと、サーバーには「午後7時30分(IST)」のローカル時刻が表示されます。ただし、両方の場所でUTCを使用すると、ユーザーはUTC時刻が3pmになり、サーバーにはUTC時刻が3pmと表示されます。

すべての場所でUTCを使用しますが、ユーザーのタイムゾーンの基準を維持することで、UTCで常に作業することができますが、時間をユーザーに表示したい場合は「ローカル」時間に変換します。

また、サーバーが仮想サーバーの場合は、特にホストされている場所に頼ることはできません。また、ホスティング会社がサーバーを設定する時間帯を想定することもできません。データベースに日付時刻を格納するときは、常にDateTime.UtcNowを使用して防御的にコードすることをお勧めします。

TimeZoneInfo.GetSystemTimeZones() 
:あなたがからのタイムゾーンのリストを見つけることができ、FYI

DateTime utcTime = new DateTime(2013, 03, 25, 10, 20, 00); 
TimeZoneInfo usersTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTime usersLocalTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, usersTimeZone); 
Console.WriteLine(utcTime.ToString("hh:mm:ss"); 
Console.WriteLine(usersLocalTime.ToString("hh:mm:ss"); 

は、あなたが次のことを行う必要がありますユーザーのタイムゾーンに戻って、このUTC時刻に変換するには

これは、プリントアウトする必要があります

10:20:00 
05:20:00 

をあなたが見ることができるように、あなたは、ユーザーのタイムゾーンを知っておく必要があります。

  1. は、自分のマシンのタイムゾーンを検出して、フォーム
に戻ってそれを投稿するには、いくつかのJavaScriptを使用して、ユーザーの好みで自分のタイムゾーンを選択するユーザーがいる:ユーザーの時間を知るには2つの方法があります。

私は、第2のオプションが人々にとってより困難なものになる可能性があるので、最初のオプションを提案します。例えば、彼らが英国に拠点を置き、週に州に飛んでいるならば。すべてがゾーンを変え、実現しないかもしれません!

+0

DateTime.UtcNowのような日付を保存しました。さて、DateTime.UtcNow.ToLocalTime()は正しく動作しません。 –

+0

データベースから戻ってから時間を元に戻そうとしていますか?もしそうなら、DateTimeオブジェクトは、ユーザの現地時間を知りません。サーバーの現地時間を使用します。元の時間を元に戻すために何をする必要があるかについての詳細を追加するために私の答えを更新します。 – Penfold

+0

それに感謝します。私はそれをjavascriptでしかできません。サーバー側で10日間、ToLocalTime()などのコードを入力して、ユーザーの現地時間で日付/時刻を表示します。だから、あなたが言うようにそれは正しくありません。それに感謝します。グローバリゼーション(文化と文化)でそれを管理することはできますか? –

2

私は国際的ユーザーが使用したプロジェクトに取り組んでいたとき、私たちは常にDateTime.UtcNow

を使用します

ローカルプロジェクトの場合(つまり、タイムゾーンでのみ使用するように設計されている場合はDateTime.Nowで十分です)。

1

ローカル時刻はシステム時刻です。オペレーティングシステムのタイムゾーンを確認してください。 参照しているサーバー時間は、サーバー構成ファイルのタイムゾーンに従います。

オペレーティングシステムのタイムゾーンとサーバーのタイムゾーンが同じであることを確認してください。

+0

ユーザーが他の国にいる場合、私のローカル時間とサーバー時間は似ていると仮定?それらのタイムゾーンは異なります –

+1

ユーザーはタイムゾーンと表示時間をローカルタイムゾーンで検出できます。私がインドにいると仮定すると、現地時間は午後5時です。サーバーはカナダのオタワにあり、サーバー時間は午前7時30分です。サーバーに保管された時間はサーバー時間になります。ユーザーに表示するときは、現地時間に変換する必要があります。 – Harpreet

+0

わかりました。私はすべてのDateTime.UtcNowを変更し、表示する前にそれを変換します。ありがとう –

関連する問題