使用JavaScript检测时区缩写

时间:2009-12-23 18:06:12

标签: javascript date timezone

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

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

20 个答案:

答案 0 :(得分:49)

原生解决方案:

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

答案 1 :(得分:16)

[抱歉我写英文的方式]

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

例如

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

输出将是“Wed Mar 30 2011 17:29:16 GMT-0300(ART)” 所以,你可以隔离括号“ART”即时区缩写之间的内容

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

输出将是“ART”

现在回答很晚,但我希望它对某些人有用

答案 2 :(得分:15)

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致力于a draft proposal to add a time zone API to browsers

答案 3 :(得分:7)

如果所有其他方法都失败了,您只需使用the long names and abbreviations创建自己的哈希表。

答案 4 :(得分:6)

这适用于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);

结果:

"CDT"

答案 5 :(得分:6)

2021 年更新

moment.js 现在是 deprecated,他们建议在新项目中改用 Luxon

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

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

注意:输出格式取决于设置的区域设置。如需更多信息,请参阅this answer

答案 6 :(得分:3)

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

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

答案 7 :(得分:3)

使用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

答案 8 :(得分:2)

2015年更新:

jsTimezoneDetect可与moment-timezone一起使用以获取时区缩写客户端:

moment.tz(new Date(), jstz.determine().name()).format('z');  //"UTC"

Moment-timezone不能对它自己执行此操作,因为它用于处理此问题的函数已被折旧,因为它在所有情况下都不起作用:https://github.com/moment/moment/issues/162以获取时区缩写客户端。

答案 9 :(得分:1)

对于 crossbrowser 支持,我建议使用YUI 3 Library:

Y.DataType.Date.format(new Date(), {format:"%Z"});

它支持strftime个标识符。

了解更多信息: http://yuilibrary.com/yui/docs/datatype/#dates

答案 10 :(得分:1)

我知道浏览器之间存在差异问题,但这是我以前在Chrome中获得的。但它仍然不是缩写,因为Chrome会返回长名称。

new Date().toString().replace(/^.*GMT.*\(/, "").replace(/\)$/, "")

答案 11 :(得分:1)

我能够立刻实现这一目标。

moment.tz(moment.tz.guess()).zoneAbbr() //IST

答案 12 :(得分:1)

这是一个棘手的主题。从我收集的内容来看,时区在创建时不会作为Date对象的一部分嵌入。您也无法为Date对象设置时区。但是,您可以从Date对象获取时区偏移量,该对象由用户的主机系统(时区)设置确定。将时区视为确定与UTC的偏移量的一种方法。

为了让生活更轻松,我强烈建议您momentmoment-timezone来处理这些事情。 Moment为Date创建了一个包装器对象,为各种事物提供了一个很好的API。

如果通过某个参数或某些东西为您提供了现有的日期对象,则可以在创建时刻对象时将其传递给构造函数,并且您已准备好滚动。此时,您可以使用moment-timezone猜测用户的时区名称,然后使用moment-timezone formatting获取时区的缩写。我冒昧地说大多数用户都会自动设置他们的时区,但你不应该依赖它来获得100%的准确率。如果需要,您还可以在拉出所需格式之前手动设置您想要使用的时区。

通常,在处理日期和时间时,最好将UTC存储在数据库中,然后使用时刻js格式化用户时区的时间。在某些情况下,您需要确保时区正确。例如,如果您允许用户为特定日期和时间安排某些事情。您需要确保在西海岸用户将时区设置为PDT / PST,然后再转换为UTC以存储在数据库中。

关于时区缩写...
以下是使用时刻和时刻时区获取时区缩写的基本示例。

// if all you need is the user's timezone abbreviation you don't even need a date object.
const usersTimezoneName = moment.tz.guess()
const timezoneAbbr = moment().tz(usersTimezoneName).format('z')
console.log(timezoneAbbr) // PST (depending on where the user is)

// to manually set the timezone
const newYorkAbbr = moment(dateObj).tz('America/New_York').format('z')
console.log(newYorkAbbr) // EST

要显示具有特定时区偏移的特定日期对象,您可以执行此操作。

const xmas = new Date('December 25, 2017 16:20:00')
const losAngelesXmas = moment(xmas).tz('America/Los_Angeles')
console.log(losAngelesXmas.format("dddd, MMMM Do YYYY, h:mm:ss a")) // Monday, December 25th 2017, 4:20:00 pm

答案 13 :(得分:0)

这是一个JavaScript自我更新,12小时格式的日期/时间显示,它不能完全回答这个问题,但是它可以帮助其他人,因为它是相关的,并建立在Stephen DuMont's解决方案和{{3链接。 MDN有一个非常有用的教程,实时更新不需要页面刷新。

使用最新版桌面FireFox,Chrome,Opera和Internet Explorer 11进行测试都有效。 “2位”小时仅在IE中为单个值前缀为零,但分钟为所有浏览器可靠地返回2位数值。测试已停止使用Windows Safari,但忽略了12小时格式,并且不会隐藏秒数。

该功能包括本地时区,以及后备语言,日期和日期显示以及12/24小时格式的可调选项。分割日期和时间以添加分隔'at'字符串。仅使用select选项设置'toLocaleTimeString'也将返回日期和时间。可以为选项和值引用MDN页面。

<!--
function dateTimeClock() {
  var date = new Date();
  document.getElementById('timedate').innerHTML = date.toLocaleDateString(['en-us', 'en-GB'], {
      weekday: 'long',
      month: 'long',
      day: '2-digit',
      year: 'numeric'
    }) + ' at ' +
    date.toLocaleTimeString(['en-us', 'en-GB'], {
      hour12: 'true',
      hour: '2-digit',
      minute: '2-digit',
      timeZoneName: 'short'
    });
  var t = setTimeout(dateTimeClock, 500);
}

function start() {
  dateTimeClock();
}
window.onload = start;
//-->
<div id="timedate"></div>

答案 14 :(得分:0)

试试这个功能

function getTimezoneAbbreviation(date) {
  // Convert the date into human readable
  // An example: Fri Jul 09 2021 13:07:25 GMT+0200 (Central European Summer Time)
  // As you can see there is the timezone

  date = date.toString();

  // We get the timezone matching everything the is inside the brackets/parentheses
  var timezone = date.match(/\(.+\)/g)[0];

  // We remove the brackets/parentheses
  timezone = timezone.replace("(", "").replace(")", "");

  // A new variable for the abbreviation
  var abbreviation = "";

  // We run a forEach dividing the timezone in words with split
  timezone.split(" ").forEach((word) => {

      // We insert the first letter of every word in the abbreviation variable
      abbreviation += word.split("")[0];

  });

  // And finally we return the abbreviation
  return abbreviation;
}

答案 15 :(得分:0)

您可以使用原生 Javascript 日期对象。 只需硬编码长时区名称 'America/Los_Angeles

var usertimezone = 'America/Los_Angeles';
var usertimezoneabbreviation = new Date().toLocaleTimeString('en-us',{timeZone: usertimezone, timeZoneName:'short'}).split(' ')[2];

console.log(usertimezoneabbreviation); //PDT

答案 16 :(得分:0)

import { tz } from 'moment-timezone';
import * as moment from 'moment';

const guess = tz.guess(true);    // "Asia/Calcutta"
const zone = tz.zone(guess);     // return Zone object 
zone.abbr(new Date().getTime())  // "IST" 
// once u pass timestamp it'll return timezone abbrevation.

答案 17 :(得分:0)

使用vanilla JavaScript无法实现。浏览器与返回时区字符串不一致。有些返回偏移量,例如+0700,而有些则返回PST

它不一致或不可靠,这就是您需要第三方脚本(如moment.js(和moment-timezone.js)或创建自己的哈希表以在偏移和时区缩写之间进行转换的原因。

答案 18 :(得分:0)

尝试使用Google的Closure类goog.i18n.DateTimeSymbols及其与语言环境相关的类。

答案 19 :(得分:-3)

try {
    result = /.*\s(.+)/.exec(date.toLocaleDateString(navigator.language, {timeZoneName:'short' }))[1];
} catch(e) {
    result = (new Date()).toTimeString().match(new RegExp("[A-Z](?!.*[\(])","g")).join('');
}

console.log(result);