我需要一种方法来检测给定日期对象的时区。我不想要偏移,也不想要完整的时区名称。我需要获得时区缩写。例如,GMT,UTC,PST,MST,CST,EST等......
这可能吗?我得到的最接近的是解析date.toString()的结果,但即使这样也不会给我一个缩写。它给了我时区的长名称。
答案 0 :(得分:49)
原生解决方案:
var zone = new Date().toLocaleTimeString('en-us',{timeZoneName:'short'}).split(' ')[2]
console.log(zone)
答案 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.
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)
moment.js 现在是 deprecated,他们建议在新项目中改用 Luxon。
您可以获得 Luxon 的时区缩写,例如:
import { DateTime } from 'luxon'
DateTime.local().toFormat('ZZZZ') // => for ex: "PDT"
注意:输出格式取决于设置的区域设置。如需更多信息,请参阅this answer。
答案 6 :(得分:3)
您可以使用 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)
答案 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个标识符。
答案 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的偏移量的一种方法。
为了让生活更轻松,我强烈建议您moment
和moment-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);