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
是值。