How to get timezone name (PDT, EST, etc.) in Javascript?
使用Javascript,有没有办法根据用户的设备获取用户的时区名称(PDT,EST等)?
我试过的代码:
1 2
| const timezone = jstz.determine()
const userTimezone = timezone.name() |
但我想在PDT,EST等中取回用户的时区名称,而不是America / New_York。
-
afaik这是不可能的。您可以使用(new Date).getTimezoneOffset()获取时区偏移量;
-
@Christoph你确定它不可能吗?
-
您应该只使用Date对象和RegEx来完成它。像Date()。match(/ ['('] ... [')'] /)
-
@DottedT抱歉,你能否澄清一下?有没有办法在没有RegEx的情况下做到这一点?同样我也可以接受答案。
-
@DottedT - 那不可靠。括号中的日期和时间之后的任何内容都是特定于实现的。在某些情况下,您将获得缩写,在其他情况下,您将获得一个完整的时区名称,并且名称差异很大。没有标准。
-
使用vanilla javascript,你拥有的最好的镜头是date.toString(),它会留下像Day Time GMT+-xxx0 (Timezone)这样的东西。然而,这种格式取决于客户端(浏览器)和操作系统语言,所以这只是猜测。 timezoneOffset是您拥有的唯一可靠信息。例如,我的浏览器给了我一些奇怪的东西,如"Eastern Normalzeit"作为时区。
-
@Christoph - 是的,并且偏移量与时区不同。请参阅timezone标记wiki中的"time zone!= offset"。
-
Mat,很好地抓住了可靠性。我忘记了。
-
@Christoph - 是的,是一个副本,但不是你链接的那个。不记得在我写下面之前我已经在其他地方回答了它。哦,我会离开的。 :)干杯!
-
Intl.DateTimeFormat()。resolvedOptions()。的timeZone
将moment.js与moment-timezone附加组件一起使用,您可以执行以下操作。无论浏览器或操作系统如何,结果都是一致的,因为缩写在库提供的数据中。
示例结果来自计算机设置到美国太平洋时区:
1 2
| var zone = moment.tz.guess(); //"America/Los_Angeles"
var abbr = moment.tz(zone).format("z"); // either"PST" or"PDT", depending on when run |
免责声明
时区缩写不可靠或不一致。它们有许多不同的列表,并且存在许多含糊之处,例如"CST"用于中央标准时间,古巴标准时间和中国标准时间。一般来说,你应该避免使用它们,你永远不应该解析它们。
此外,时刻时区中的缩写来自IANA TZ数据库。在该数据的最新版本中,许多"发明的"缩写已被替换为数字偏移。例如,如果您的用户的时区是Asia/Vladivostok,而不是像以前版本中那样获得"VLAT",那么您将获得"+10"。这是因为缩写"VLAT"最初是由tz数据库发明的,用于填充数据,并且该区域的人员并未实际使用。请记住,缩写词也始终使用英语 - 即使在其他语言缩写可能实际使用的区域也是如此。
-
非常感谢! 会试一试并接受答案。 如果你不介意,我有几个问题。 那么如果我想显示时区名称,你会建议什么? America/Los_Angeles会更好吗?
-
您正在寻找的数据类似于"东部标准时间",用英语拼写。 JavaScript还没有很好的答案,但这是在CLDR中。 可以通过支持它的Intl API进行访问,toLocaleString上有timeZone和timeZoneName选项。 但这些并不适用于所有地方。
-
当然,这在很大程度上取决于背景。 缩写可能确实适合您的使用。 或不。 你没有说过你的用法。
-
疑难杂症! 还有一个问题,tz代表什么?
-
这是时刻时区API的一部分。 文档在这里。
-
工作就像一个魅力。 谢谢马特!