getTimezoneOffset并非始终有效



我在网页上注册了以下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%的时间内都不起作用吗?

jQuery对我来说很好,所以我不明白为什么除非禁用JavaScript或不加载jQuery,否则它就不能工作。

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

更好的方法是在浏览器上转换为UTC。或者至少使用调用中有问题的日期/时间来获取TimezoneOffset。

更新的答案

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

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

由于文本输入的值是可变的,因此在许多时区中,1月份的偏移量与6月份不同。因此,最好在浏览器上将其转换为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是值。

相关内容

  • 没有找到相关文章

最新更新