DateTime.Now
を使用すると、サーバーの観点から日付と時刻を取得します。 ASP.NETでclient日時を取得する方法はありますか?
非表示の入力フィールドを作成し、JavaScriptルーチンをフォームのonsubmitイベントにワイヤリングします。このルーチンは、クライアントマシンの時刻を非表示フィールドに入力します。
非表示フィールドは、HTMLコントロールの「HtmlInputHidden」クラスを使用することにより、ASP.NETで使用できます。入力コントロールに、他のサーバー側コントロールと同様にrunat = "server"属性を与えるだけです。
サーバーは、フォームがポストバックしたときに、今度はそれを読み取ることができます。これをいくつかの場所で行う必要がある場合は、サーバーコントロールでこれをラップすることもできます。
または、AJAXを使用してこれを行うこともできますが、実装は使用するライブラリによって異なります。
ブラウザー/システムの時間とタイムゾーンを使用するか、ユーザーにタイムゾーンを選択させるというアイデアが気に入っています。過去のプロジェクトでは、次のようなものを使用しました。
<script language="javascript">
function checkClientTimeZone()
{
// Set the client time zone
var dt = new Date();
SetCookieCrumb("ClientDateTime", dt.toString());
var tz = -dt.getTimezoneOffset();
SetCookieCrumb("ClientTimeZone", tz.toString());
// Expire in one year
dt.setYear(dt.getYear() + 1);
SetCookieCrumb("expires", dt.toUTCString());
}
// Attach to the document onload event
checkClientTimeZone();
</script>
そしてサーバー上で:
/// <summary>
/// Returns the client (if available in cookie) or server timezone.
/// </summary>
public static int GetTimeZoneOffset(HttpRequest Request)
{
// Default to the server time zone
TimeZone tz = TimeZone.CurrentTimeZone;
TimeSpan ts = tz.GetUtcOffset(DateTime.Now);
int result = (int) ts.TotalMinutes;
// Then check for client time zone (minutes) in a cookie
HttpCookie cookie = Request.Cookies["ClientTimeZone"];
if (cookie != null)
{
int clientTimeZone;
if (Int32.TryParse(cookie.Value, out clientTimeZone))
result = clientTimeZone;
}
return result;
}
または、URLパラメータとして渡して、Page_Loadで処理することもできます。
http://Host/page.aspx?tz=-360
すべてのタイムゾーンが1時間ではないため、分を使用することを忘れないでください。
ユーザープロファイルを管理している場合は、ユーザーにタイムゾーンを教えてもらい、必要な計算を行うことができます。
別の方法は、ユーザーのIPアドレスに基づいてユーザーを地理的に特定することです。または、ブラウザにこの機能がある場合はジオロケーションします(Firefoxで近日提供予定)。ユーザーの場所を取得したら、タイムゾーンを検索できます。
Javascriptソリューションはおそらく良い簡単なものです。
クライアントとサーバーが完全に同期していない可能性があるため、問題は、クライアントコンピューターの時刻が必要か、またはサーバーの時刻が必要かを時間帯の違いに合わせて調整することです。 JavaScriptは、クライアントの時間(タイムゾーンを含む)を取得します。サーバーの時刻とクライアントのタイムゾーンを組み合わせることもできます。
ただし、リクエストのレイテンシよりも高い精度で時間を取得することはできません。