使用 JavaScript 检测时区缩写

IT技术 javascript date timezone
2021-02-17 05:23:11

我需要一种方法来检测给定日期对象的时区。我不想要偏移量,也不想要完整的时区名称。我需要获取时区缩写。

例如,GMT、UTC、PST、MST、CST、EST 等...

这可能吗?我得到的最接近的是解析 的结果date.toString(),但即使这样也不会给我一个缩写。它给了我时区的长名称。

6个回答

原生解决方案:

var zone = new Date().toLocaleTimeString('en-us',{timeZoneName:'short'}).split(' ')[2]
console.log(zone)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

您可以传递undefined而不是en-us默认为浏览器的当前语言环境。

@GokulanPH 使用任何东西,但在其他本地化时区可能被称为其他东西。老实说,我不知道,请与您当地的人一起尝试,如果结果不同,请告诉我们。
2021-04-18 05:23:11
这在 IE11 中不起作用,它在 IE11 中返回“未定义”,还有其他适用于所有浏览器的解决方案吗?
2021-04-24 05:23:11
这给了我 GMT+10,而不是 AEST。然而,长版本给了我澳大利亚东部标准时间。这是在运行 Chrome 的 Mac 上。
2021-04-30 05:23:11
为什么我们需要把'en-us'?如果我从不同的时区运行会影响吗?
2021-05-03 05:23:11
在过去几个月的某个时候,在 Chrome 中这开始返回“GMT-6”而不是 EST/CST/PST 等。以前工作正常。
2021-05-03 05:23:11

moment-timezone包括一个未记录的方法.zoneAbbr(),它返回时区缩写。这还需要一组规则,可根据需要选择和下载。

这样做:

<script src="moment.js"></script>
<script src="moment-timezone.js"></script>
<script src="moment-timezone-data.js"></script>
<script>
    moment().tz("America/Los_Angeles").zoneAbbr();
</script>

返回:

'PDT' // As of this posting.

编辑(2018 年 2 月)

Evan Czaplicki 已经起草了一份提案,将时区 API 添加到浏览器

在我的几个项目,我用这两种我让 jstz 检测初始值,但我让用户更改它。当然,您的要求可能会有所不同。
2021-05-04 05:23:11
是的,但首先要了解当地时区是一项挑战。参见stackoverflow.com/a/18252251/634824
2021-05-06 05:23:11
好点子。我也使用jsTimeZoneDetect但是,正如您在链接中提到的那样,我正在考虑切换到在用户配置文件中设置时区。
2021-05-17 05:23:11

Date对象没有获取时区缩写的方法,但它在toString. 例如,

var rightNow = new Date();
alert(rightNow);

...会返回类似的东西Wed Mar 30 2011 17:29:16 GMT-0300 (ART)时区缩写可以在括号之间隔离:

var rightNow = new Date();
alert(String(String(rightNow).split("(")[1]).split(")")[0]);

输出将是时区缩写,如ART.

很好的答案,但对于那些使用它的人来说......它不适用于所有浏览器。不同浏览器的格式化日期字符串可能不同。
2021-05-01 05:23:11
为什么 JS Date 这么乱?new Date();铬 = Wed May 07 2014 09:20:32 GMT-0500 (UTC). 火狐= 2014-05-07T14:20:54.371ZSafari = Wed May 07 2014 09:21:49 GMT-0500 (CDT).
2021-05-01 05:23:11
@ShaneStillwell 您的抱怨似乎与date.toString()您创建new Date(). 规范toString()将其描述为依赖于实现,这似乎是不使用此答案的一个很好的理由。
2021-05-12 05:23:11
在 Chrome 中,它为我写下完整的日期,而不是缩写版本。虽然获得人类可读的时区标签仍然非常整洁。
2021-05-13 05:23:11

这在 Chrome、Firefox 中完美运行,但主要在 IE11 中运行。在 IE11 中,没有像“Indian Chagos Time”这样的直接缩写的时区将返回“ICT”而不是正确的“IOT”

var result = "unknown";
try{
    // Chrome, Firefox
    result = /.*\s(.+)/.exec((new Date()).toLocaleDateString(navigator.language, { timeZoneName:'short' }))[1];
}catch(e){
    // IE, some loss in accuracy due to guessing at the abbreviation
    // Note: This regex adds a grouping around the open paren as a
    //       workaround for an IE regex parser bug
    result = (new Date()).toTimeString().match(new RegExp("[A-Z](?!.*[\(])","g")).join('');
}
console.log(result);

结果:

"CDT"
这个策略最接近我想要的。虽然您在第 4 行(未定义date)中有错误,但构建缩写的正则表达式对我来说是一个尽力而为的解决方案。谢谢!
2021-04-27 05:23:11
感谢您指出错误,我已经更新了代码段。
2021-05-16 05:23:11

2021 年更新

moment.js 现在已弃用,他们建议在新项目中使用Luxon

您可以获得 Luxon 的时区缩写,例如:

import { DateTime } from 'luxon'
DateTime.local().toFormat('ZZZZ') // => for ex: "PDT"

注意:输出格式取决于设置的语言环境。有关更多信息,请参阅此答案