5

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

C# 分離コード DateTime.UtcNow を使用して、すべての時間を SQL 2005 データベースに保存しています。

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

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

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

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

4

7 に答える 7

6

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

于 2008-10-27T14:47:13.280 に答える
3

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

  1. UTC からユーザーへのオフセット値を保存し、時間を UTC で保持します
  2. JS 経由でクライアント側の変換を行います (エレガントではなく、適切でもありません。私の意見では)
  3. MSDN の推奨事項と Timezone 名前空間を確認してください。
于 2008-10-27T14:40:16.413 に答える
2

.NET 3.5使用していて、ユーザーのタイムゾーンがわかっている場合は、TimeZoneInfoが役に立ちます。.NET 3.5 を使用していない場合は、TimeZoneのインスタンスを取得するための P/Invoke サンプルがいくつかありますが、3.5 にアクセスできる場合はそれを避ける価値があります。(TimeZoneInfo には履歴データなどが含まれており、一般的に推奨される方法です。)

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

于 2008-10-27T14:38:53.843 に答える
2

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

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

于 2008-10-27T14:45:18.277 に答える
1

常に日時を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);
}
于 2015-04-27T09:14:50.817 に答える
0

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

于 2008-10-27T15:13:42.790 に答える
0

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

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

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

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

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

于 2008-10-27T15:03:44.027 に答える