私が使用するとき、私DateTime.Now
はサーバーの観点から日付と時刻を取得します。ASP.NETでクライアントの日付と時刻を取得する方法はありますか?
6 に答える
ブラウザ/システムの時間とタイムゾーンを使用するか、タイムゾーンを選択できるようにするというアイデアが気に入っています。過去のプロジェクトでは、次のようなものを使用しました。
<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
すべてのタイムゾーンが完全な時間であるとは限らないため、分を使用することを忘れないでください。
私がしたいことは、非表示の入力フィールドを作成し、Javascript ルーチンをフォームの onsubmit イベントに接続することです。このルーチンは、非表示フィールドにクライアント マシンの時刻を入力します。
隠しフィールドは、HTML コントロールの "HtmlInputHidden" クラスを使用して ASP.NET で使用できます。他のサーバー側コントロールと同様に、入力コントロールに runat="server" 属性を与えるだけです。
サーバーは、フォームがポストバックするときにこの時間を読み取ることができます。複数の場所でこれを行う必要がある場合は、これをサーバー コントロールにまとめることもできます。
または、AJAX を使用してこれを行うこともできますが、実装は使用するライブラリによって異なります。
ユーザープロファイルを維持している場合は、タイムゾーンを教えてもらい、必要な計算を行うことができます。
もう 1 つの方法は、ユーザーの IP アドレスに基づいてユーザーの位置を特定することです。または、ブラウザにこの機能がある場合はジオロケートします (Firefox では近日公開予定)。ユーザーの場所を取得したら、タイムゾーンを検索できます。
JavaScript ソリューションは、おそらく適切で簡単なものです。
クライアントとサーバーは完全に同期されていない可能性があるため、問題は、クライアント コンピューターの時刻が必要なのか、それともサーバーの時刻が必要であるがタイム ゾーンの違いを調整したいのかということです。Javascript を使用すると、クライアントの時刻 (タイムゾーンを含む) を取得できます。サーバーの時刻とクライアントのタイムゾーンを組み合わせることもできます。
ただし、リクエストのレイテンシよりも高い精度で時間を取得することはできません。
私はVBでASP.Netでこのメソッドを使用しました
Dim strLanguage As String = Request.UserLanguages(0)
Dim currentCulture As CultureInfo = CultureInfo.CreateSpecificCulture(strLanguage)
Dim dateformat As String = currentCulture.DateTimeFormat.ShortDatePattern
これにより、データを見ているコンピューターのデータ時間形式が得られます。