0

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

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

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

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

有谁明白为什么这在 100% 的时间里都不起作用?

4

1 回答 1

2

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

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

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

更新的答案

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

<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来执行此操作- 因为它可以让您更好地控制输入字符串的解析方式。

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

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

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

于 2013-08-13T22:41:21.827 回答