サーバー側 (コード ビハインド、データベースなど) では常に UTC (GMT) 時間を使用し、表示のみを目的として時刻を UTC から現地時間に変換することをお勧めします。つまり、データベースでの時間の節約、計算の実行など、すべての時間操作は UTC を使用して行う必要があります。
問題は、コード ビハインドがクライアント ブラウザーのタイム ゾーンをどのように認識するかということです。ユーザーがフォームに日付/時刻の値 ( 12/30/2009 14:30など) を入力し、それをサーバーに送信したとします。ユーザーが現地時間を送信したと仮定すると、サーバーはこの値を UTC に変換する方法をどのように知るのでしょうか?
アプリケーションはユーザーにタイム ゾーンを指定する (そしてそれを永続的な Cookie またはデータベースに保存する) ように求めることができますが、それにはユーザーの余分な労力が必要であり、アプリはそのためのロジックと画面を実装する必要があります。アプリがクライアントのタイム ゾーンを自動的に判断できればもっといいでしょう。
私は JavaScript のgetTimezoneOffset関数を利用してこの問題に対処しました。これは、クライアントの現地時間と GMT の時差をサーバーに伝えることができる唯一の API です。これはクライアント側 API であるため、次のことを行いました。サーバー側で、タイム オフセット値を保持するカスタム セッション Cookie をチェックし、それが利用できない場合は、ページをリロードします (POST 呼び出しではなく GET 呼び出し中のみ)。タイム オフセットを生成して Cookie に保存するための JavaScript ロジックが追加されています。クライアント側からは、これはほとんど透過的です (セッション中に一度、GET でページをリロードします)。Cookie にオフセットを取得したら、時間変換の方向 (UTC から現地時間、または現地時間から UTC) に応じて、時間管理関数に適用します。
これは少し複雑に聞こえるかもしれませんが、ヘルパー関数を作成した後、この機能をサイトに統合するには、 (時間変換が必要なページの) Page_Load で1 回の呼び出しを行い、送信時に時間変換ルーチンを使用するだけで済みました。ブラウザとの間で時間値を取得します。使用方法の例を次に示します。
using My.Utilities.Web;
...
// Derive the form class from BaseForm instead of Page.
public class WebForm1: BaseForm
{
...
private void Page_Load(object sender, System.EventArgs e)
{
// If we only want to load the page to generate the time
// zone offset cookie, we do not need to do anything else.
if (InitializeLocalTime())
return;
// Assume that txtStartDate is a TextBox control.
if (!IsPostback)
{
// To display a date-time value, convert it from GMT (UTC)
// to local time.
DateTime startDate = GetStartDateFromDB(...);
txtStartDate.Text = FormatLocalDate(startDate);
...
}
else
{
// To save a date-time value, convert it from local
// time to GMT (UTC).
DateTime tempDate = DateTime.Parse(txtStartDate.Text);
DateTime startDate = ConvertLocalTimeToUtc(tempDate);
SaveStartDateInDB(startDate, ...);
...
}
}
...
}
詳細が必要な場合は、そろそろ時間です: ASP.NET アプリケーションでの時間のローカライズの記事をご覧ください (申し訳ありませんが、asp.netPRO は有料購読者のみへのアクセスを制限しているため、発行元のサイトに記事への直接リンクはありません。 ; ただし、PDF コピーへのリンクがあります)。記事のサンプルを投稿できればいいのですが、著作権を侵害したくありません。ただし、必要なすべての機能とドキュメントを含むヘルパー ライブラリを構築するプロジェクトを次に示します(不要なものは無視してください)。
更新: この記事は、新しい発行元によるサンプル プロジェクトと共にオンラインで投稿されました。