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