1

クライアントの時間を知る必要があります。私の行動方針は、Cookieにオフセットを保持してから、計算することです。私の問題は、最初のページをロードしているときでも、まだCookieを挿入する必要があることです。たくさんの方法があることは知っていますが、誰もその必要性に答えません。最初のページが読み込まれる前に現地時間を使用する必要があります。そのため、JavaScriptを使用できません。

投稿でユーザーをクライアントに送り返し、Cookieを入れてサーバーに返そうとしましたが、Cookieがないため、Googleにとっては問題があります。

関数は次のとおりです。

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;
        }
    }

カルチュアに基づいてオフセットを見つけようと思いましたが、どうすればいいのかわかりません。

4

1 に答える 1

0

いくつかのこと:

  • UTC時間に取得するには、あまりにも多くの作業を行っています。を使用するだけDateTime.UtcNowです。
  • スクリプトのポストバックは過去のものです。jqueryを使用していることはすでに示しているので、ajax投稿を実行してサーバーに送信します。それはあなたのグーグルの問題も解決します。
  • 最初のページでそれが必要な場合は、UTC時刻を送信してクライアントで変換するか、ajaxgetを実行して取得します。
  • ユーザーは自分の時計を好きなタイムゾーンに設定でき、夏時間のためにオフセットは多くのユーザーにとって変更される可能性があり、変更されることを覚えておいてください。それらのオフセットを永続的なCookieに保持すると、変更後に戻ってくるときに間違った時間が発生します。一時的なCookieに含まれていることを確認してください。おそらく、頻繁にリセットする必要があります。
  • クライアントの現地時間を使用してデータを処理していると言いますか?何のために詳しく説明してもらえますか?現地時間はあいまいになる可能性があるため、これは非常に危険なことです。おそらくUTCに基づいて処理しているはずです。処理中にクライアントのオフセットが必要な場合はDateTimeOffset、サーバーでを使用する必要があります。 ここで確認してください
于 2013-01-24T15:55:39.040 に答える