2008-11-08 69 views
23

当我使用DateTime.Now时,我从服务器的角度得到日期和时间。有没有办法在ASP.NET中获取客户端日期和时间?如何在ASP.NET中获取客户端日期和时间?

+0

JavaScript可能很糟糕,因为很多用户的时间设置不准确。另外,它可能会被某人滥用。您必须验证UTC的偏移量是否合理。 – hangy 2008-11-08 15:32:23

回答

11

我会做的是创建一个隐藏的输入字段,然后将一个JavaScript例程连接到窗体的onsubmit事件。这个例程将在客户端机器上用时间填充隐藏字段。

隐藏字段可以通过使用HTML控件“HtmlInputHidden”类与ASP.NET一起使用。你只要给你输入控制一个runat =“服务器”属性就像任何其他服务器端控制。

然后,服务器可以在表单回传后这段时间内读出。如果你需要在很多地方这样做,你甚至可以把它包装在一个服务器控件中。

另外,你可以用AJAX做到这一点,但实现将取决于你使用的库。

+2

而不是做所有这些,只需使用Javascript来设置一个cookie,存储浏览器时区。然后后端可以随时读取该cookie。 – 2014-05-14 22:05:47

+0

Cookie存在的问题是人们旅行。 – 2018-02-21 15:38:56

4

如果你维护一个用户配置文件,你可以让他们告诉你他们的时区,然后做必要的计算。

0

另一种方法是根据他/她的IP地址对用户进行地理定位。或者,如果浏览器具有此功能(即将推出的Firefox),则会进行地理定位。一旦你有用户的位置,你可以查找时区。

JavaScript解决方案可能是一个很好的和容易的。

+2

IP不一定会给出正确的答案。我有一个客户端使用单个站点进行所有网络连接(从一个站点到另一个站点的直接管道),因此所有这些客户端都来自CST IP,无论他们身在何处。 – 2008-11-08 16:26:15

+0

Stephen:我们的业务是隐藏客户IP,因此VPN-in位于布拉格,代理服务器位于柏林。例如,客户是在莫斯科。 – abatishchev 2011-02-26 01:46:46

0

客户端和服务器可能不完全同步,所以问题是如果你想在客户端计算机上的时间,或者你想在服务器上的时间,但调整时区差异。 Javascript可以让你在客户端的时间(包括时区)。您还可以将服务器上的时间与客户端的时区组合在一起。

尽管如此,您永远无法获得比请求的正确性更高的精度。

16

我喜欢使用浏览器/系统时间和时区或让他们选择他们的时区的想法。在过去的项目中,我使用的是这样的:

<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 

只记得使用分钟,因为并非所有的时区都是整小时。

-5

我在ASP.Net使用这种方法用VB

Dim strLanguage As String = Request.UserLanguages(0) 
Dim currentCulture As CultureInfo = CultureInfo.CreateSpecificCulture(strLanguage) 
Dim dateformat As String = currentCulture.DateTimeFormat.ShortDatePattern 

这将产生计算机的观察数据的数据时间格式。

相关问题