例如,东部和中部的差异是 1。我下面的解决方案感觉很老套。有没有更简单/更好的方法?
var diff = (parseInt(moment().tz("America/New_York").format("ZZ")) - parseInt(moment().tz("America/Chicago").format("ZZ"))) / 100;
我的例子是使用 Momentjs 库。
原文由 Homer 发布,翻译遵循 CC BY-SA 4.0 许可协议
例如,东部和中部的差异是 1。我下面的解决方案感觉很老套。有没有更简单/更好的方法?
var diff = (parseInt(moment().tz("America/New_York").format("ZZ")) - parseInt(moment().tz("America/Chicago").format("ZZ"))) / 100;
我的例子是使用 Momentjs 库。
原文由 Homer 发布,翻译遵循 CC BY-SA 4.0 许可协议
由于夏令时 ( dst ) 之类的原因,两个时区之间的差异只能根据特定时间来衡量。
但是,对于特定日期,下面的代码应该有效。
function getOffsetBetweenTimezonesForDate(date, timezone1, timezone2) {
const timezone1Date = convertDateToAnotherTimeZone(date, timezone1);
const timezone2Date = convertDateToAnotherTimeZone(date, timezone2);
return timezone1Date.getTime() - timezone2Date.getTime();
}
function convertDateToAnotherTimeZone(date, timezone) {
const dateString = date.toLocaleString('en-US', {
timeZone: timezone
});
return new Date(dateString);
}
偏移量/差异以毫秒为单位
那么你所要做的就是:
const offset = getOffsetBetweenTimezonesForDate(date, 'America/New_York', 'America/Chicago');
原文由 shub_shah 发布,翻译遵循 CC BY-SA 4.0 许可协议
13 回答13k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
计算两个任意时区之间 的 差异是不可能的。您只能及时计算 特定时刻 的差异。
这在两个时区之间的一般情况下是正确的。然而, 有些 时区要么完全同时切换,要么根本不切换。
请记住,在美国,每个使用 DST 的时区实际上会在不同的时间切换。它们都在 当地时间 凌晨 2:00 切换,但不是在同一个 通用 时间。
另请参阅 时区标签 wiki 中的“时区!=偏移量”。
现在关于时刻时区,你在评论中说:
Web 服务器的时区无关紧要。您应该能够在世界任何地方进行托管,而不会影响您的应用程序。如果你做不到,那你就做错了。
您 可以获得 您所在 时区(美国中部时间)与用户所在时区之间的 当前 时差。如果代码在浏览器中运行,您甚至不需要为此知道用户的确切时区:
相反,如果代码在服务器上运行(在 node.js 应用程序中),那么您 将 需要知道用户的时区。只需像这样更改第一行:
更新的答案:
在支持 ECMAScript 国际化 API 并已完全实现 IANA 时区支持的环境中, 无需 Moment 即可完成此操作。这是当今大多数浏览器。
用法示例:
如果你想要它们之间的差异,你可以简单地减去结果。
节点.js
上面的函数在 Node.js 中工作,其中安装了
full-icu
国际化 支持(这是 Node 13 和更新版本的默认设置)。如果您的旧版本带有system-icu
或small-icu
,则可以使用此修改后的函数。它也适用于浏览器和full-icu
环境,但更大一些。 (我已经在 Linux 上的 Node 8.17.0 和 Windows 上的 Node 12.13.1 上进行了测试。)请注意,无论哪种方式,我们都 必须 通过
Intl
才能正确应用时区。