【问题标题】:getTimezoneOffset does not work all the timegetTimezoneOffset 并非一直有效
【发布时间】:2013-08-15 17:11:49
【问题描述】:

我在我的网页上注册了以下 javascript。当用户回帖时,有时 txtTimeZoneOffSet 隐藏字段会返回为空白。当我在我的电脑上测试时,我总是得到一个值。它发生在不同的浏览器(I.E、FireFox 和 Safari)上。

我试图让用户偏移,所以当他们输入日期时,我可以在服务器上将其转换为 UTC 并处理同一时区中的所有内容,然后当我将日期返回给他们时,我确保它在他们的时区。

<script type='text/javascript'>
      $(window).load(function () {
            var d = new Date();
            var tz = d.getTimezoneOffset();

            $('#txtTimeZoneOffSet').val(tz / 60);
        });
</script>

有谁明白为什么这不能 100% 工作?

【问题讨论】:

    标签: asp.net timezone timezone-offset


    【解决方案1】:

    jQuery 对我来说看起来不错,所以我不明白为什么它不能工作,除非 JavaScript 被禁用或者你没有加载 jQuery。

    但是,您的工作是基于一个有缺陷的假设,即用户的 当前 偏移量对于所有日期都是相同的。在任何有夏令时的时区,它都可能是错误的。

    更好的方法是在浏览器上转换为UTC。或者至少在调用 getTimezoneOffset 时使用相关日期/时间。

    更新答案

    针对您的问题,您现在拥有的代码将获得 current 偏移量。您只是不能保证他们可能输入的任何日期的偏移量都是相同的。例如:

    <input type="text" id="someDate" />
    
    var someDateString = $('#someDate').val();
    var dt = new Date(someDateString);
    var offset = dt.getTimezoneOffset();
    

    由于文本输入的值是可变的,因此在许多时区中,一月的偏移量与六月的偏移量不同。所以更好的办法是在浏览器上将其转换为 UTC:

    var someDateString = $('#someDate').val();
    var dt = new Date(someDateString);
    var s = dt.toISOString();
    

    字符串 s 将采用 ISO8601 格式,并且已经转换为 UTC。

    当然,如果是我,我会使用 moment.js 来执行此操作 - 因为它可以让您更好地控制输入字符串的解析方式。

    这种方法通常足够好。 但是,如果有任何机会您必须在服务器上进行此转换,可能是因为用户不在场,那么您必须知道他们的时区。不仅是偏移量,还有实际时区。请参阅timezone tag wiki 中的“时区!= 偏移量”。

    最好的方法是向他们索取。像this one 这样的基于地图的选择器是一个不错的选择。您甚至可以使用jsTimezoneDetect 猜测默认选择。最终,您将获得可以在服务器上使用的字符串标识符,例如 America/New_York。在 .Net 中,您可以将这些与 Noda Time 中的 TZDB 提供程序一起使用。

    如果您不想要任何花哨的库,您可以坚持使用 Windows 时区,并显示来自 TimeZoneInfo.GetSystemTimeZones() 的下拉列表,其中 .Id 是键,.DisplayName 是值。

    【讨论】:

    • 是的,我也很困惑为什么它“有时”不起作用。我的假设(我知道假设不好)是他们启用了 JavaScript,因为他们会在我们的网站上出现问题/错误。因此,您有任何示例代码可以更好地获取用户所处的当前“有效”偏移量(包括夏令时)。我的谷歌搜索没有出现太多。或者你知道有没有开发过的jQuery插件?
    • 谢谢。标记为已回答,因为它为我指明了修复它的正确方向。一种选择是当用户登录时,显示时区并在不正确时让他们更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2018-03-12
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多