在不使用字符串的情况下获取javascript中另一个时区的时区偏移量

Jen*_*ens 0 javascript timezone datetime date timezone-offset

我想计算从“用户时间”到“ WET / WEST”的偏移量。

我让用户抵消了new Date().getTimezoneOffset()

但是,如何获取WET / WEST的偏移量,以便能够计算两者的组合偏移量?

例如,如果用户在中欧时间(CET / CEST),则在冬季,组合偏移量将为-60(CET)+ 0(WET)= -60。夏季为-120(CEST)+ 60(WEST)= -60。在这种情况下,它始终为-60,但用户也可以具有不带DST的时区。

如果不将其格式化为字符串并从该字符串中读出新的时区,是否可以做到这一点?

Mat*_*int 5

您不能可靠地使用时区缩写作为输入,因为可以用许多不同的方式来解释它们。例如,CST可以是北美的“中央标准时间” ,也可以是“中国标准时间”或“古巴标准时间”。虽然有些缩写像WETWEST是唯一的,但许多是模棱两可的。请参阅此处的时区缩写列表

相反,您需要知道IANA时区标识符。使用WET / WEST的一个位置是Portugal,它是IANA的IANA标识符"Europe/Lisbon"。您可以在此处找到标识符列表。选择正确的标识符非常重要,因为时区会随着时间变化。每个标识符反映每个区域的特定历史记录。

一个您知道IANA时区标识符的人,然后您可以选择如何使用它:

  1. 在某些完全支持ECMAScript国际化API(ECMA-402)的时区功能的现代浏览器中,您可以执行以下操作:

    var d = new Date();
    var s = d.toLocaleString(undefined, { timeZone: "Europe/Lisbon" })
    
    Run Code Online (Sandbox Code Playgroud)

    这将在格式化期间将提供的日期和时间转换为正确的时区。通过undefined第一个参数将使用当前语言环境进行格式化。

    这种方法有一些缺点,因为尚未在所有浏览器中实现,并且没有API可以仅检索特定时间点的原始时区偏移量。

  2. 您可以考虑使用实现此功能的库。 我在这里列出其中几个。我个人的喜好是带有moment-timezone插件的moment.js,您可以执行以下操作:

    var m = moment.tz("Europe/Lisbon");
    var s = m.format();
    
    Run Code Online (Sandbox Code Playgroud)

    您可以根据需要将参数传递给该format方法以显示输出。您还可以转换现有时间,例如:

    var m = moment.utc("2016-01-01T00:00:00").tz("Europe/Lisbon");
    var s = m.format();
    
    Run Code Online (Sandbox Code Playgroud)

    您还可以像这样获取特定时间的偏移量:

    var m = moment.utc("2016-01-01T00:00:00").tz("Europe/Lisbon");
    var offsetInMinutes = m.utcOffset();
    var offsetAsString = m.format("Z");
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您可以编写自己的代码来处理特定时区。尽管这可能容易出错,但我一般不建议这样做。如果沿着这条路走,更新可能会特别困难。

还请记住,特定时区的偏移量将根据生效的日期和时间而有所不同。因此,new Date()根据您的情况,代表“现在”的输入可能会或不一定总是正确的输入。

  • 关于#1。好的,我可以将给定日期更改为特定时区。但我(和操作员)想要计算用户当前时区和任意时区之间的时区差异。所以在你的例子中:“d”和“s”之间有什么区别(以小时、秒或其他为单位)? (2认同)