我在网页上注册了以下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
是值。