使用JavaScript检测时区缩写

spu*_*dly 43 javascript timezone date

我需要一种方法来检测给定日期对象的时区.我不想要偏移,也不想要完整的时区名称.我需要获得时区缩写.例如,GMT,UTC,PST,MST,CST,EST等......

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

小智 58

原生解决方案:

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

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

  • 这给了我GMT + 10,而不是AEST.然而长版本给了我澳大利亚东部标准时间.这是在运行Chrome的Mac上. (5认同)
  • 这是一种仅限英语的快速技巧。但它可能满足 80% 的用例。 (2认同)

abs*_*nce 17

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>
Run Code Online (Sandbox Code Playgroud)

返回:

'PDT' // As of this posting.
Run Code Online (Sandbox Code Playgroud)

编辑(2018年2月)

Evan Czaplicki致力于为浏览器添加时区API的提案草案.

  • 在我的几个项目中,我使用*both*.我让jstz检测到一个初始值,但我让用户更改它.当然,您的要求可能会有所不同. (3认同)
  • 是的,但首先要了解本地时区是一项挑战。见 http://stackoverflow.com/a/18252251/634824 (2认同)

小智 16

[对不起我怎么写英文]

嗨,date对象没有获取时区abreviation的方法,但是在toString返回的几乎结束时它是隐含的:

例如

var rightNow = new Date();
alert(rightNow);
Run Code Online (Sandbox Code Playgroud)

输出将类似于"Wed Mar 30 2011 17:29:16 GMT-0300(ART)",因此,您可以隔离括号"ART"即时区缩写之间的内容

var rightNow = new Date();
alert(String(String(rightNow).split("(")[1]).split(")")[0]);
Run Code Online (Sandbox Code Playgroud)

输出将是"ART"

这是迟到的回答,但我希望它对某些人有用

  • 很好的答案,但对于那些使用这个...它不适用于所有浏览器.格式化的日期字符串可以在各种浏览器中不同. (13认同)
  • @ShaneStillwell,您的抱怨似乎是“date.toString()”,这是您创建“new Date()”时在控制台中看到的内容。“toString()”的规范将其描述为依赖于实现,这似乎是不使用这个答案的一个很好的理由。 (3认同)
  • 为什么JS Date搞砸了?`new Date();`Chrome =`Wed Wed 07 2014 09:20:32 GMT-0500(UTC)`.Firefox =`2014-05-07T14:20:54.371Z`.Safari =`Wed Wed 07 2014 09:21:49 GMT-0500(CDT)`. (2认同)

Thi*_*key 14

您可以使用formatToParts的方法Intl.DateTimeFormat来获取短时区缩写。在世界某些地区,这可能会返回类似 的字符串"GMT+8",而不是实际时区名称的缩写。

let timeZone = new Intl.DateTimeFormat('en-us', { timeZoneName: 'short' })
  .formatToParts(new Date())
  .find(part => part.type == "timeZoneName")
  .value
console.log(timeZone)
Run Code Online (Sandbox Code Playgroud)

  • @ThirstMonkey 我想要 timeZoneName 作为 EST 或 PST。你怎么知道总是使用 'en-us' 也可能是 de-De (3认同)

Cha*_*lie 8

这在Chrome,Firefox中完美运行,但仅限于IE11.在IE11中,没有直接缩写的时区如"印度Chagos时间"将返回"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);
Run Code Online (Sandbox Code Playgroud)

结果:

"CDT"
Run Code Online (Sandbox Code Playgroud)


And*_*est 7

如果所有其他方法都失败了,您只需使用长名称和缩写创建自己的哈希表.

  • 这不应该是选定的答案. (10认同)
  • 实际上时区名称不是官方的或标准化的。尽管得到 IANA 的支持,tz 数据库是由志愿者维护的。“America/Los_Angeles”是该数据库中记录的名称,并附有注释“美国太平洋时间,以洛杉矶为代表”。同样来自该数据库文件:“该文件绝不是权威的;如果您认为自己更了解,请继续编辑该文件......” (3认同)

Siv*_*K V 6

使用来自的内容new Date().toString()

const timeZoneAbbreviated = () => {
  const { 1: tz } = new Date().toString().match(/\((.+)\)/);

  // In Chrome browser, new Date().toString() is
  // "Thu Aug 06 2020 16:21:38 GMT+0530 (India Standard Time)"

  // In Safari browser, new Date().toString() is
  // "Thu Aug 06 2020 16:24:03 GMT+0530 (IST)"

  if (tz.includes(" ")) {
    return tz
      .split(" ")
      .map(([first]) => first)
      .join("");
  } else {
    return tz;
  }
};

console.log("Time Zone:", timeZoneAbbreviated());
// IST
// PDT
// CEST
Run Code Online (Sandbox Code Playgroud)


zin*_*ngi 6

2021 年更新

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

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

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

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


小智 5

我只用了片刻就实现了这一目标。

moment.tz(moment.tz.guess()).zoneAbbr() //IST
Run Code Online (Sandbox Code Playgroud)