如何在 ASP.NET 中获取客户端日期和时间?

Posted

技术标签:

【中文标题】如何在 ASP.NET 中获取客户端日期和时间?【英文标题】:How to get client date and time in ASP.NET? 【发布时间】:2010-09-21 10:47:00 【问题描述】:

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

【问题讨论】:

javascript 可能不好,因为很多用户的时间设置不准确。此外,它可能会被某人滥用。您必须确定与 UTC 的偏移是否合理。 【参考方案1】:

如果您要维护用户个人资料,您可以让他们告诉您他们的时区,然后进行必要的计算。

【讨论】:

【参考方案2】:

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

javascript 解决方案可能是一个很好且简单的解决方案。

【讨论】:

IP 不一定会给出正确的答案。我有一个客户使用单个站点进行所有网络连接(从一个站点到另一个站点的直接管道),因此无论它们实际位于何处,它们都来自 CST IP。 Stephen:我们的业务是隐藏客户端 IP,因此 ***-in 在布拉格,proxy-out 在柏林。例如,客户在莫斯科。【参考方案3】:

客户端和服务器可能不完全同步,所以问题是您是否想要客户端计算机上的时间,或者您想要服务器上的时间,但针对时区差异进行了调整。 Javascript 可以让您了解客户端的时间(包括时区)。您还可以将服务器上的时间与客户端的时区结合起来。

但是,您永远无法以比请求延迟更高的精度获得时间。

【讨论】:

【参考方案4】:

我要做的是创建一个隐藏的输入字段,然后将 Javascript 例程连接到表单的 onsubmit 事件。此例程将使用客户端计算机上的时间填充隐藏字段。

隐藏字段可以通过使用 html 控件“HtmlInputHidden”类与 ASP.NET 一起使用。您只需为输入控件提供 runat="server" 属性,就像任何其他服务器端控件一样。

当表单回发时,服务器可以读取这个时间。如果您需要在许多地方执行此操作,您甚至可以将其封装在服务器控件中。

或者,您可以使用 AJAX 执行此操作,但具体实现取决于您使用的库。

【讨论】:

不用做所有这些,只需使用 Javascript 设置一个 cookie,存储浏览器时区。然后后端可以随时读取该cookie。 cookie 的问题在于人们旅行。 这对表单提交/回发很有好处,但是如果您在初始页面加载时需要客户端时间怎么办?【参考方案5】:

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

<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

请记住使用分钟,因为并非所有时区都是整小时。

【讨论】:

这一行不清楚 Int32.TryParse(cookie.Value, out result);您将 cookie 值存储在结果变量中,但在您将总分钟数存储到结果变量之前。不是很清楚你的服务器端例程 GetTimeZoneOffset() 函数。如果可能,请解释一下。 @Thomas 我从服务器时区开始,然后检查客户端时区 cookie 是否存在。如果 cookie 存在,尝试将字符串转换为整数分钟。【参考方案6】:

我在 ASP.Net 中用 VB 使用了这个方法

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

这将产生查看数据的计算机的数据时间格式。

【讨论】:

欢迎来到 ***!请重新阅读问题。用户想知道客户端的本地时间,而不是时间格式。

以上是关于如何在 ASP.NET 中获取客户端日期和时间?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

使用 C# ASP.NET 获取原始日期和时间

asp.net 根据时间获取星期

如何在 ASP.NET 中以 'YYYY-MM-DD' 格式获取当前日期?

如何使用客户端的时区将 asp.net 日期时间反序列化为 JSON 日期时间

ASP.NET vb.net 将月/日/年中的日历日期格式转换为具有日/月/年的日期对象