使用 jsTimezoneDetect 脚本显示三个字母的时区代码

Display three letters time zone code using jsTimezoneDetect script

我正在使用 jsTimezoneDetect 脚本检测用户当前时区。下面的代码将结果显示为 America/Chicago。有没有办法显示 CDT/CST(取决于今天的日期)?

var timezone = jstz.determine();
timezone.name();

或者我可以使用任何其他脚本吗?

在原生 JS 中你可以:

var d = new Date();
timezone = d.getTimezoneOffset();

然后用一个开关过去。

首先了解:

  • 时区缩写可能不明确(5 个不同的 CST)。
  • 并非所有时区都有有意义的缩写。有些只是为了完成API而编造的,但实际上并未被该地区的人们使用(白俄罗斯的 MSK)。
  • 对于正确使用的缩写(HST 与 HAST)经常存在分歧。
  • 它们通常是英文的,但对于同一时区,其他语言可能有不同的缩写。 (PST vs HNP(法语))
  • 缩写在很大程度上取决于所选的具体日期 - 因为它可能会因夏令时而改变(EST 与 EDT)。

在许多浏览器中,您可以通过以下方式直接获取缩写(通过 ECMA-402):

const d = new Date(); // now, or the specific date in question
const tz = d.toLocaleString('en', {timeZoneName: 'short'}).split(' ').pop();
console.log(tz);

虽然这不一定适用于所有地方。

由于您使用的是 jsTimeZoneDetect,因此您已经拥有 IANA 时区标识符 ("America/Chicago")。因此,您可以从 moment-timezone 获取它,如下所示:

var m = moment(); // now, or the moment in question
var s = m.tz('America/Chicago').format('z');

这将适用于任何地方,但你有时刻和时刻时区以及 jstz 的开销,除非你将这些库用于其他目的,否则这可能是过大的杀伤力。

您也可以考虑服务器端解决方案。例如,如果您使用 PHP,则可以使用 this code. Or, if you're using .NET, you can use my TimeZoneNames 库。