如何在Page_Load获取用户本地时间

时间:2012-03-27 11:08:29

标签: c# javascript asp.net timezone

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

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

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

ANSWER启发的最终解决方案: 这是我最终解决问题的方法。我将当地日期保存在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值。 感谢您的回答/评论!

5 个答案:

答案 0 :(得分:4)

我将解释一下以下代码以及你要做的事情。

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

此提交将立即使用localTime设置创建POST请求,然后ASP .Net将此POST值存储到会话中。

由于可用性,我还在原始页面中添加了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);
            }
        }
    };
}

答案 1 :(得分:0)

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

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

一种替代方法是在回发之前捕获客户端时间,但是无法使用初始值Page_Load执行此操作。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

据我所知,没有任何方法可以在Page_Load事件中获取用户本地时间,因为它在服务器端执行,因此只知道服务器的当地日期时间。

要获取用户的本地时间,您需要在JavaScript加载页面时执行对服务器的异步调用,或者将本地时间存储在隐藏字段中,然后在回发后读取。

答案 4 :(得分:0)

或者只使用包含js的插页式页面来获取本地时间并重定向到当前页面,通过查询字符串或会话变量传递时间信息或发布