質問

中西部(東部標準時)のサーバーで稼働しているASP.Net 2.0 Webアプリケーションがあります。現在、すべてのお客様はサーバーと同じタイムゾーンにいます。アリゾナで別のサーバーをオンラインにします(山岳部標準時)。

DateTime.UtcNowのC#コードビハインドを介して、すべての時間をSQL 2005データベースに保存しています。

テスト中に、タイムゾーン変換の問題が発生しました。 私たちの問題は、Webブラウザーで、テストするタイムゾーンの東部標準時ではなく、山岳部標準時が表示されることです。

新しい情報を入力すると、データベースにUTCとして保存されますが、ブラウザーでその情報を表示すると、Mountain Standard Timeが表示されます。 以下は、データベースからUTC値を取得してブラウザーに表示するコードです。

lblUpdatedDate.Text = Convert.ToDateTime(dr["UpdatedDate"]).ToLocalTime().ToString();

上記のコードは、ブラウザが実行されている東部標準時ではなく、サーバーがある山地標準時を返します。ユーザーの現在地を表示する時間を取得するにはどうすればよいですか?

役に立ちましたか?

解決

同じ問題がありました。 Webサーバーとは異なるタイムゾーンにいるユーザーにアプリケーションを販売しました。 UTCには時間情報を保存しませんでしたが、実際には正しく機能していました。サーバーのタイムゾーンで表示される時間は、正確に3時間遅れて表示されていました。私たちがしなければならなかったのは、タイムゾーンドロップダウンを追加して、サイト全体のタイムゾーンを選択できるようにすることだけでした(アプリケーションのユーザーのみがタイムゾーンにいるため)。この設定を保存し、すべての日時表示を取得し、TimeZoneInfo名前空間を使用して1つのタイムゾーンから別のタイムゾーンに変換する関数を挿入しました。完璧に機能します。

他のヒント

現地時間へは常にサーバー側で物理的な場所に変換されます。いくつかのオプションがあります。

  1. UTCからのオフセット値をユーザーに保存し、時間をUTCで保持します
  2. JSを介して変換クライアント側を実行します(エレガントではなく、適切でもありません、私の意見では)
  3. いくつかの MSDNの推奨事項とタイムゾーンの名前空間

.NET 3.5を使用している場合 ユーザーのいるタイムゾーンがわかっている場合、 TimeZoneInfo は友達です。 .NET 3.5を使用していない場合、 TimeZone ですが、3.5にアクセスできる場合はそれを避ける価値があります。 (TimeZoneInfoには履歴データなどが含まれており、一般的に推奨される方法です。)

ユーザーがどのタイムゾーンにいるかを確認することは別の問題です。混乱を避けるための最も簡単な方法は、ユーザーにオプションを与えることです。 (オフセット「今すぐ」を取得すると、限られた情報しか得られません。)

ASP.NETを使用する前に、このような何かに遭遇しました。これが私の一般的な方法論です。

document.writeを実行するためにJavaScriptを送信しました。 JavaScriptは、GMTからのクライアントのオフセットを決定します。そのため、特定の時間を送信してから、JavaScriptにプラス/マイナスをかけることができます。

日付時刻は常にGMT形式で保存してください。

2つのステップがあります:

Javascriptを使用してクライアント側で異なるタイムゾーンを検出します:

var dt = new Date();
var diffInMinutes = -dt.getTimezoneOffset();

次に、サーバー側で、上記の検出されたタイムゾーンオフセットに基づいてサーバー時間をクライアント時間に変換するC#コード:

string queryStr = Request.QueryString["diffInMinutes"];
int diffInMinutes = 0;
if (Int32.TryParse(queryStr, out diffInMinutes))
{
    clientTime = serverTime.ToUniversalTime().AddMinutes(diffInMinutes);
}

データベースとクライアントが異なるタイムゾーンにあるWebサービスを介してデータベースを呼び出すリモートクライアントで、同じまたは同様の問題が発生しました。

タイムゾーンの境界を越えて時間が変更されないように、タイムゾーンを気にしないようにデータセットに指示するのが最も簡単であることがわかりました...

テーブルごとにデータセット内のすべての日時フィールドを変換するユーティリティメソッド(SetAllDateModes)を作成しました-ここにビジネスエンド(Foreach)とdateModeを設定する呼び出しがあります:

foreach (DataColumn dc in dt.Columns)
{
  if (dc.DataType == typeof(DateTime))
  {
    dc.DateTimeMode = dateMode;
  }
}
SetAllDateModes(dt, DataSetDateTime.Unspecified);

DateSetDateTime.Unspecifiedにはオフセットが含まれていないため、変換は行われません。

日付と地域をローカライズしないというのが一般的な考え方だと思いました。ユーザーに提示するまでの時間。したがって、人間がそれを読まない限り、UTC、GMT、CUTのままです。もう1つのメモでは、日付/時刻ライブラリを使用しているため、夏時間の変更に関する問題を心配する必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top