如何在页面获取用户本地时间

我有一个用ASP.NET编写的网页,我需要在Page_Load检索最终用户的本地时间。 我想过使用Javascript获取当地时间(通过使用new Date() ),但问题在于脚本在服务器事件之后运行。

任何想法如何实现这一目标?

编辑:我的页面非常复杂:它显示一个图表,其中包含大量来自数据库,对象/字段选择列表等的计算字段; 客户现在要求它考虑用户的时区,并且时区应该由网页自动确定。 用户日期对于确定图表间隔(显示数据的哪一天)很重要。 数据加载(因为它非常复杂)在Page_LoadPage_PreRender 。 放弃这些事件需要整页重写。

最终解决方案被解答:最终解决问题的方法如下。 我将当地日期保存在cookie中。 以下是设置cookie的方法:

function SetLocalDateCookie() {
    var cookieName = 'LOCALDATE';
    var localDate = new Date();
    var realMonth = localDate.getMonth() + 1;
    var localDateString = localDate.getFullYear() + "/" + realMonth + "/" + localDate.getDate();
    setCookie(cookieName, localDateString, 2);
    try {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + 2);
        document.cookie = cookieName + "=" + escape(localDateString) + ";expires=" + exdate.toGMTString();
    }
    catch (e)
    { }
}

在我的母版页中,我在$(document).ready调用此方法。 在我使用这个cookie的页面上,我将下面的代码添加到Page_Init

if (string.IsNullOrEmpty(CookieHandler.Instance.GetCookie(CookieKeys.LocalDate)))
{
    Response.ClearContent();
    Response.Write(@"<form id='local' method='post' name='local'>
                        <script type='text/javascript'>
                            SetLocalDateCookie();
                            document.getElementById('local').submit();
                        </script>
                    </form>");
    Response.Flush();
    Response.End();
}

然后我可以在C#代码中使用cookie值。 谢谢你的回答/评论!


我会解释一下下面的代码和你要做的事情。

在关闭此页面的第一个请求时,代码检查LocalTime是否尚未存储在Session中,如果不是,它将编写一个表单元素,一个隐藏的输入和一个javascript,它将使用当地时间发布该表单。 响应结束,因此您的报告将无法获得生成机会。

此提交将立即创建一个带有localTime集合的POST请求,然后ASP .Net将此POST值存储到Session中。

由于可用性,我还在原始页面中添加了302重定向(Response.Redirect)。 用户最初是一个GET请求,而不是POST,所以如果他/她想刷新页面,浏览器将重申最后一个操作,即form.submit()而不是GET请求。

你现在有当地时间。 但是,您不必每次请求都阅读它,因为它可以与UTC时间进行比较,然后与服务器的时间进行比较。

编辑:您需要将UTC时间解析为DateTime,但可能很容易找到格式,但可能取决于用户的文化(不确定此语句)。

public ReportPage()
{
    this.Init += (o, e) =>
    {
        // if the local time is not saved yet in Session and the request has not posted the localTime
        if (Session["localTime"] == null && String.IsNullOrEmpty(Request.Params["localTime"]))
        {
            // then clear the content and write some html, a javascript code which submits the local time
            Response.ClearContent();
            Response.Write(@"<form id='local' method='post' name='local'>
                                <input type='hidden' id='localTime' name='localTime' />
                                <script type='text/javascript'>
                                    document.getElementById('localTime').value = new Date();
                                    document.getElementById('local').submit();
                                </script>
                            </form>");
            // 
            Response.Flush();

            // end the response so PageLoad, PagePreRender etc won't be executed
            Response.End();
        }
        else
        {
            // if the request contains the localtime, then save it in Session
            if (Request.Params["localTime"] != null)
            {
                Session["localTime"] = Request.Params["localTime"];
                // and redirect back to the original url
                Response.Redirect(Request.RawUrl);
            }
        }
    };
}

我不认为这是可能的,你不能在服务器端从客户端的本地机器上得到时间。

实现这一目标的唯一方法是使用一些JavaScript(因为这是基于客户端的,所以它将使用客户端的当前日期/时间)。 但正如你所说的那样,这将是在你的服务器事件已经运行之后,你的网页已经被渲染成HTML并发送到客户端。

一种选择是在Post Back之前捕获客户,但是不可能通过首页Page_Load来做到这一点。


如何在页面上放置一个隐藏文本框,在C#中使用OnChange-eventhandler附加它,并使用OnLoad JavaScript函数将该值设置为您需要的来自客户端的值?

链接地址: http://www.djcxy.com/p/58563.html

上一篇: How to get user local time at Page

下一篇: Open link in a new window with Capybara