2011-01-21 8 views
1

私は多くのサブアプリケーションによってcompsedグローバルなアプリケーションがあります。.NET - アプリケーションレベルでタイムゾーンを定義する

  • Webサイト
  • Windowsサービス

が、私はそれらの「アプリケーションの一部を派遣したいです"多くのサーバーで。 問題は次のとおりです。日付を正確にしたい。 イベントが太平洋の午後6時に保存されている場合、私は自分のヨーロッパのユーザーに自分のボードに「午後6時」を見せたくありません。

私はあまりにも多くの仕事を表して、私はそれぞれ単一の日付を保存する方法を変更することはできません =>しかし 「あなたはちょうどそのようにあなたの日付を保存しなければならない」と言う記事の多くを、(読んだ

はい、それは保存され日時オフセットではない日時です)。

私はサーバー上のタイムゾーンを変更することを提案している他の記事を読んだことがありますが、私はが他の目的のために使用できるので、そうしたくありません。

良いニュースは、日付は常にアプリケーションで定義され、はデータベースによって生成されないことです。

結果的に、唯一必要なことは、アプリケーションレベルタイムゾーンを定義することです。どこにいても、私のアプリケーションは常に同じタイムゾーンで動作します。残っている唯一のステップは、現在のユーザーのタイムゾーンでUIレベルの日付を変換することです(すべての日付が同じローカライズされた日時変換メソッドを通過するので非常に簡単です)。

アプリケーション開発者の作業方法を変更する余裕はありません。エラーが発生しやすいためです。彼らは変換を考えずにDateTime.Nowを使い続ける必要があります。

私が使用している正確な技術はここでは関係ありません。問題はグローバル.Netです。あなたの助け


編集用

ありがとう:さんは私の問題だけでUTC日付を返すDateTime.Nowを持つことであるとしましょう。 これを行う方法はありますか?

+0

'app.config'を使用できませんか?ここに実際の質問はありますか? – bzlm

+2

あなたが言っていることは、「正しい方法でやれる時間がない、間違ったコードを保持して正しい答えを得たい」ということです。正確に聞こえますか? –

+0

エラーが発生する可能性がありますか?すべてをUTCで時刻として保存して取得します。あなたの唯一の解決策だと私は思う。 – hometoast

答えて

1

UTCで常時格納します。

DateTime.UtcNow 

次に、クライアントでTZ補正を行います。

編集:私はDateTime.Nowを変更しないという重要な部分を見逃していました。プログラマーに正しいことをさせる;それはあまりエラーが起きにくいです。

すべてのクライアントコードでDateTime.UtcNowを使用するか、すべてのクライアントコードでタイムスタンプを取得するためにデータベースを使用する必要があります。どちらにしても - あなたは仕事があります。

幸運を祈る!

保存サーバー上のローカルアプリケーションのタイムゾーン:

+0

DateTime.Nowを使用する多くのプログラマーに、DateTime.Nowを使用しているチームが常に変化していることを尋ねますa。日付を取得するネット標準の方法は、それはエラーが発生しやすいです。すべてのプロジェクトで問題を修正するために、コードを常に確認する必要があります。 – Mose

+0

これを行うには2つの方法しかありません。そして両方の方法は多くのものを変えることを伴う。または、すべてのクライアントマシンにUTCのタイムゾーンを設定させる(そして、約束を守ることを祈っている - もしあなたがそれを変更するなら、あなたがそれを確認するコードを持っていなければ、決して知らないだろう)。 – hometoast

0

は、私は答えは、このシンプルであれば、私はおそらく質問を誤解してることを理解した上で、あなたに簡単な答えを与えるつもりです。次に、必要なときに現地時間を変換することができます。あなたのローカル開発者がDateTime.Nowを使用している場合、データベースのどこかであれば、DateTime.Nowのこの値がこのタイムゾーンに合わせて調整されていると言うことができます。

これは、または私は何かを見落としていますか?

+0

あなたは、何百万行ものコードを変更することを意味します。^^毎日の保存方法を変更する必要があるためです。そして、これは私が解決したい問題です... – Mose

+0

@モーズ:はい、あなたが長いこと物事をする壊れたやり方に慣れてきたら、修正するのに少し時間がかかるかもしれません - それが重要な理由ですできるだけ早く事をする壊れた方法を使って*止める*。 –

0

オプション:すべてのDatetimesをGMT/UTCに保存し、ユーザー(ブラウザ)からJavaScriptを使用してタイムゾーンを取得し、そのタイムゾーンを考慮して日付を表示します。

// Gets the Browsers timezone offset in minutes 
function getClientTimezoneOffsetInMinutes() 
{ 
    var rightNow = new Date(); 
    var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0); 
    var date2 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0); 
    var temp = date1.toGMTString(); 
    var date3 = new Date(temp.substring(0, temp.lastIndexOf(" ") - 1)); 
    var temp = date2.toGMTString(); 
    var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ") - 1)); 
    var hoursDiffStdTime = (date1 - date3)/(1000 * 60 * 60); 
    var hoursDiffDaylightTime = (date2 - date4)/(1000 * 60 * 60); 
    return hoursDiffStdTime; 
} 
+0

私はあなたが誤解していると思います:問題はインターフェイスレベルではなく、アプリケーションレベルです。私は午後6時にログを作成する香港にWindowsサービスがあるとしましょう。そのログは、午後6時にフランスの別のWindowsサービスによって消費されます。私がデータベースに保存する必要があるものは、UTCの日付です。 Javascriptは私を助けません – Mose

+0

GMT/UTCですべての日付を保存するように、はい、上記のように、javascriptはあなたのタイムゾーンを得るために役立ちますので、 –

関連する問題