1

我需要知道客户的时间。我的做法是将偏移量保留在cookie中,然后计算。我的问题是我还需要插入 cookie,即使在加载第一页时也是如此。我知道有很多方法,但没有人回答需要。我需要在加载第一页之前使用本地时间。所以我不能使用JavaScript。

我试图在帖子中将用户发送回客户端,放入cookie然后将其返回给服务器,但这对谷歌来说是有问题的,因为他们没有cookie。

这是功能:

public static DateTime? GetClientTime()
    {
        HttpRequest Request = HttpContext.Current.Request;
        if (Request.Cookies["DynoOffset"] != null)
        {
            string strOffset = Request.Cookies["DynoOffset"].Value;
            int offset = int.Parse(strOffset);
            TimeZone localZone = TimeZone.CurrentTimeZone;
            DateTime currentDate = DateTime.Now;
            DateTime CreationDate = localZone.ToUniversalTime(currentDate).AddMinutes(-offset);
            return CreationDate;
        }
        else
        {
            StoreClientTime();
            return null;
        }
    }

    public static DateTime? StoreClientTime()
    {
        var Context = HttpContext.Current;
        var Session = Context.Session;
        var Response = Context.Response;
        var Request = Context.Request;
        // if the local time is not saved yet in Session and the request has not posted the localTime
        if (Request.Cookies["DynoOffset"] == null && String.IsNullOrEmpty(Request.Params["localTime"]))
        {
            // then clear the content and write some html a javascript code which submit the local time
            Response.ClearContent();
            Response.Write("<form id='local' method='post' name='local'>" +
                "<script src=\"/Js/jquery-1.7.1.min.js\" type=\"text/javascript\"></script>" +
                "<script src=\"/Js/JqueryUI/jquery.cookie.js\" type=\"text/javascript\"></script>" +
                "<script type=\"text/javascript\">" +
                    "$.cookie(\"DynoOffset\", new Date().getTimezoneOffset(), { expires: 150 });" +
                    "$(\"#local\").submit()" +
                "</script>" +
                "</form>");
            // 
            Response.Flush();

            // end the response so PageLoad, PagePreRender etc won't be executed
            Response.End();
            return null;
        }
        else
        {
            return GetClientTime().Value;
        }
    }

我想根据calture找到偏移量,但我不知道该怎么做。

4

1 回答 1

0

一些东西:

  • 您在 UTC 时间做的工作太多。只需使用DateTime.UtcNow.
  • 脚本回发已成为过去。您已经展示了您正在使用 jquery,因此只需执行 ajax post 将其发送到服务器。这也将解决您的谷歌问题。
  • 如果您的第一页需要,则发送 UTC 时间并在客户端上进行转换 - 或者执行 ajax get 来检索它。
  • 请记住,用户可以将他们的时钟设置为他们想要的任何时区,并且由于夏令时/夏令时,许多用户的偏移量可以并且将会改变。如果您将它们的偏移量保存在永久 cookie 中,那么当它们在更改后返回时,您将有错误的时间。确保它在一个临时 cookie 中,并且它可能是您想要经常重置的东西。
  • 您说您正在使用客户端的本地时间处理数据?能详细说明是为了什么吗?这是一件非常危险的事情,因为当地时间可能不明确。您可能应该基于 UTC 进行处理。如果您在处理时需要客户端的偏移量,则应DateTimeOffset在服务器上使用 a 。 在这里回顾
于 2013-01-24T15:55:39.040 回答