【问题标题】:Set timezone cookie BEFORE first page load在第一页加载之前设置时区 cookie
【发布时间】:2023-03-19 03:24:01
【问题描述】:

在我的 ASP.NET 网站上,我有很多带有时间戳的页面。我想将时间戳从服务器时间即时转换为浏览器时间。为此,我需要在代码隐藏中获取客户的时区偏移量。

我尝试使用 JavaScript 在每个页面的 <head> 中设置 TimezoneOffset cookie。但它(显然)在第一次加载页面时不起作用(之前没有设置 cookie)。

是否有任何优雅的解决方案将日期从服务器时间转换为客户端时间?

我看到的唯一解决方案是检查Page_Load中的TimezoneOffset cookie,然后重定向到将设置此cookie的虚拟页面,然后使用JS重定向回原始页面,但我不喜欢这个解决方案。

【问题讨论】:

    标签: javascript asp.net cookies


    【解决方案1】:

    我认为您无法在用户访问页面之前访问任何用户的信息,但您可以在头脑中检查 cookie 并重新加载页面。这看起来像这样:

    var time = getCookie("timezoneoffset");
    if(time !== undefined) {
        //congrats, the timezone is set!
    } else {
        //set the cookie here, then do this:   
        location.reload()
    }
    

    【讨论】:

    • 我使用了描述的方法,但它有一个问题:我使用UpdatePanels,它们在脚本运行之前显示,所以用户看到日期闪烁。我正在尝试以某种方式重新设计它(在服务器端转换日期)。
    【解决方案2】:

    您可以在设置 cookie 后通过刷新来使用 Wyatt 的解决方案(当然,您必须忽略真正的第一个请求,因为它没有 cookie)

    var time = getCookie("timezoneoffset");
    if(time != undefined) {
        //congrats, the timezone is set!
    } else {
        //set the cookie here, then do this ....
        location.reload();
    }
    

    您是否考虑过在客户端进行这种转换?这可能是一个更好的解决方案(但很大程度上取决于您的应用架构)。

    同样,您可以将您的潜在客户限制为接受 cookie 的人(但这是另一回事)。

    【讨论】:

    • 我现在在客户端转换它,但我有问题:我使用UpdatePanel,所以我必须在ScriptManager.RegisterStartupScript 中注册“replaceDates”脚本,但在RegisterStartupScript 中注册的脚本会被执行显示页面后 1-2 秒,我看到我的日期如何从 UTC 更改为本地时间。
    • 如果您对丢失第一个请求没问题,您可以设置 cookie 客户端并在之后刷新页面。
    • 另见stackoverflow.com/questions/338482/…,但执行此操作的简单方法(2)的原理是相同的。困难的方法(1)是使用基于 IP 的地理位置,这涉及到很多乐趣,我认为 ...
    • 在这种情况下,这比使用innerHTML 更有意义,不敢相信我没有想到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2014-10-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多