在JavaScript中获取客户端的时区偏移量

JavaScript

米亚十三Harry

2020-03-12

如何收集访问者的时区信息?我需要时区以及GMT偏移时间。

第898篇《在JavaScript中获取客户端的时区偏移量》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

18个回答
飞云卡卡西神乐 2020.03.12

这样就可以了。


var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);

Thu May 25 2017 21:35:14 GMT+0300 (IDT)

未定义

乐米亚 2020.03.12

您可以尝试一下。它将返回您当前的机器时间

var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())

宝儿理查德村村 2020.03.12

这对我来说是非常好的工作:

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
前端猪猪GO 2020.03.12

您只需要包含moment.js和jstz.js

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>

在那之后

<script>
$(function(){
 var currentTimezone = jstz.determine();
 var timezone = currentTimezone.name();
 alert(timezone);
});

</script>
神乐Pro 2020.03.12

我只是在寻找3个字母的字符串(例如“ PDT”),并尝试了Marquez的答案,但为了进行跨浏览器支持,不得不对其进行一些调整。幸运的是,字符串是最后的潜在匹配项:)

这是我在CoffeeScript中所做的:

browserTimezone = ->
  userDate = new Date()
  zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
  userZone = zoneMatches[zoneMatches.length - 1]

可在IE8,IE9,Safari 9,Firefox 44和Chrome 48中使用

卡卡西卡卡西 2020.03.12

这是我的解决方案:


    // For time zone:
    const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
    
    // Offset hours:
    const offsetHours = new Date().getTimezoneOffset() / 60;
    
    console.log(`${timeZone}, ${offsetHours}hrs`);
樱古一 2020.03.12

使用此将OffSet转换为正值:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
卡卡西Mandy 2020.03.12

尝试这个,

new Date().toString().split("GMT")[1].split(" (")[0]
HarryTom 2020.03.12
function getLocalTimeZone() {
    var dd = new Date();
    var ddStr = dd.toString();
    var ddArr = ddStr.split(' ');
    var tmznSTr = ddArr[5];
    tmznSTr = tmznSTr.substring(3, tmznSTr.length);
    return tmznSTr;
}

范例:2018年6月21日星期四18:12:50 GMT + 0530(印度标准时间)

O / P:+0530

null 2020.03.12

时区(以小时为单位)

var offset = new Date().getTimezoneOffset();
if(offset<0)
    console.log( "Your timezone is- GMT+" + (offset/-60));
else
    console.log( "Your timezone is- GMT-" + offset/60);

如果您想像评论中所说的那样精确,那么您应该尝试这样-

var offset = new Date().getTimezoneOffset();

if(offset<0)
{
    var extraZero = "";
    if(-offset%60<10)
      extraZero="0";

    console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
    var extraZero = "";
    if(offset%60<10)
      extraZero="0";

    console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}

宝儿猿 2020.03.12

With , you can find current timezone as

console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>


With , you can find current timezone as

console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>

Both API returns utc offset in minutes.

理查德凯 2020.03.12

JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);

路易伽罗 2020.03.12

提供偏移量和时区的单线是简单地在新的Date对象上调用toTimeString()从MDN:

toTimeString()方法以美国可读的形式返回Date对象的时间部分。

问题是时区不是标准的IANA格式。它比“洲/城市” IANA格式更加人性化试试看:

console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);

现在在加利福尼亚州,toTimeString()返回Pacific Daylight Time时,Intl API返回America/Los_Angeles在哥伦比亚,你会得到Colombia Standard Time,主场迎战America/Bogota

请注意,此问题的许多其他答案尝试通过调用Date.toString()获得相同的信息。正如MDN解释的那样,这种方法并不可靠

日期实例是指特定的时间点。调用toString()将以人类可读的格式返回使用美国英语格式的日期。[...]有时需要获取时间部分的字符串;用这种toTimeString()方法可以完成这样的事情

toTimeString()方法是特别有用的,因为实现ECMA-262标准的发动机可以从所获得的字符串中不同toString()Date对象,该格式是与实现有关的; 简单的字符串切片方法可能无法在多个引擎上产生一致的结果。

卡卡西卡卡西 2020.03.12

尝试getTimezoneOffset()Date对象:

var curdate = new Date()
var offset = curdate.getTimezoneOffset()

此方法返回以分钟为单位的时区偏移量,这是GMT与本地时间(以分钟为单位)之间的差。

小卤蛋小卤蛋小哥 2020.03.12

我在项目中编写了一个函数,该函数以hh:mm格式返回时区我希望这可以帮助某人:

function getTimeZone() {
    var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
    return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}

// Outputs: +5:00

function getTimeZone() {
  var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
  return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}


// See output
document.write(getTimeZone());

工作小提琴

猿飞云斯丁 2020.03.12

您可以使用:

时区

<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>

// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();

浏览器时区检测很难正确完成,因为浏览器提供的信息很少。

那一刻时区使用Date.getTimezoneOffset(),并Date.toString()围绕本年度时刻屈指可数收集尽可能有关浏览器的环境中尽可能多的信息。然后,它将该信息与所有加载的时区数据进行比较,并返回最接近的匹配项。如果有联系,则返回人口最多的城市所在的时区。

console.log(moment.tz.guess()); // America/Chicago
TomProSam 2020.03.12

我意识到这个答案有点离题,但我想我们中许多人正在寻找一个答案,他们也想格式化显示的时区,也许还要获得时区缩写。所以就这样...

如果您希望客户端时区的格式正确,则可以依靠JavaScript Date.toString方法并执行以下操作:

var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];

例如,这将为您提供“ GMT-0400(EST)”,包括时区分钟(如适用)。

另外,使用正则表达式,您可以提取任何所需的部分:

对于“ GMT-0400(EDT)”:

new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]

对于“ GMT-0400”:

new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]

仅针对“ EDT”:

new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]

对于“ -0400”:

new Date().toString().match(/([-\+][0-9]+)\s/)[1]

Date.toString参考:https : //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString

西门村村古一 2020.03.12

var offset = new Date().getTimezoneOffset();
console.log(offset);

时区偏移量是UTC与本地时间之间的差(以分钟为单位)。请注意,这意味着如果本地时区在UTC之后,则偏移量为正;如果在本地时区之前,则偏移量为负。例如,如果您的时区是UTC + 10(澳大利亚东部标准时间),则将返回-600。夏时制即使在给定的语言环境下也可以防止该值保持恒定

请注意,并非所有时区都被整个小时抵消:例如,纽芬兰是UTC减去3h 30m(将夏令时排除在外)。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android