通过javascript获取客户端时间并回发帖子

时间:2013-01-23 06:16:58

标签: c# asp.net datetime

我需要知道客户的时间。我的做法是保持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;
        }
    }

我想根据卡路里找到偏移量,但我不知道怎么做。

1 个答案:

答案 0 :(得分:0)

一些事情:

  • 你在UTC时间做的工作太多了。只需使用DateTime.UtcNow
  • 脚本回发已经成为过去。你已经证明你正在使用jquery,所以只需要做一个ajax帖子就可以将它发送到服务器了。这也将解决您的谷歌问题。
  • 如果您的第一页需要,请发送UTC时间并在客户端转换 - 或者执行ajax获取它。
  • 请记住,用户可以将时钟设置为他们想要的任何时区,并且由于夏令时/夏令时,许多用户的偏移量可能会发生变化。如果将它们的偏移量保留在永久性cookie中,那么当它们在更改后返回时,您将有错误的时间。确保它在一个临时cookie中,这可能是你想要经常重置的东西。
  • 您说您使用客户的当地时间处理数据?你能详细说明一下吗?这是一件非常危险的事情,因为当地时代可能含糊不清。您可能应该基于UTC进行处理。如果在处理时需要客户端的偏移量,则应在服务器上使用DateTimeOffsetReview here