【问题标题】:How to get user local time at Page_Load如何在 Page_Load 获取用户本地时间
【发布时间】:2012-04-10 22:02:30
【问题描述】:

我有一个用 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 值。 感谢您的回答/cmets!

【问题讨论】:

  • 您希望用户的本地时间在您的服务器事件运行之前?
  • 我也考虑过使用cookie...但是它的值需要不断更新(它必须保存一个日期时间);还有第一次加载页面并且没有设置 cookie 时会发生什么?
  • 这样做的目的是什么?为什么初始页面加载日期/时间不够用?
  • 你需要这个本地日期时间做什么?可能还有其他方法可以实现您的最终目标
  • 是的,我知道了。但是你为什么这么快就需要它呢?你打算用它做什么?哪些服务器事件需要使用它,为什么?目前我唯一能想到的是你需要它来在那个页面上显示,但如果是这种情况,你可以在页面加载时用 javascript 修改显示

标签: c# javascript asp.net timezone


【解决方案1】:

我会稍微解释一下下面的代码以及你需要做什么。

在此页面的第一个请求中,代码检查 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);
            }
        }
    };
}

【讨论】:

  • 感谢您的想法。最后,我将本地日期存储在 cookie 中(格式并不重要,因为我以自己的“自定义”格式保存 cookie)。我将在问题描述中详细说明我的最终解决方案。
【解决方案2】:

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

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

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

【讨论】:

  • 在 http 模块中,您在页面加载之前有许多事件。
  • @我看不出他想要客户时间。思想服务器时间。 :) 已删除。
  • @RoyiNamir 啊,现在说得通了!
  • 我同意@Royi。您可以在页面的预渲染事件中注册 javascript。
  • @JohnnyDropTables Royi 指的是服务器端日期/时间。他没有意识到 OP 是在客户端日期/时间之后。
【解决方案3】:

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

【讨论】:

  • 让我看看我是否理解:我在 Page_Load 中执行的操作将在 OnChange 事件处理程序中移动?
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2022-01-23
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多