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

时间:2009-07-07 09:48:17

标签: javascript timezone

如何收集访客的时区信息?我需要时区以及GMT抵消时间。

30 个答案:

答案 0 :(得分:498)

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

  

时区偏移是UTC与本地时间之间的差异(以分钟为单位)。请注意,这意味着如果本地时区落后于UTC,则偏移量为正,如果前置,则偏移量为负。例如,如果您的时区是UTC + 10(澳大利亚东部标准时间),则将返回-600。夏令时可以防止该值即使对于给定的区域设置也是常量

请注意,并非所有时区都按整个小时偏移:例如,纽芬兰是UTC减去3小时30分钟(将夏令时留在等式中)。

答案 1 :(得分:311)

使用偏移来计算时区是一种错误的方法,您将始终遇到问题。时区和夏令时规则可能会在一年内多次改变,并且很难跟上变化。

要在JavaScript中获取系统的IANA timezone,您应该使用

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

截至2019年3月,这works in 90% of the browsers used globally。它not的作用Internet Explorer

旧兼容性信息

ecma-402 / 1.0表示如果没有提供给构造函数,timeZone可能是未定义的。但是,未来的草案(3.0)通过更改为系统默认时区来解决该问题。

  

在此版本的ECMAScript Internationalization API中,   如果没有timeZone属性,timeZone属性将保持未定义   提供给Intl.DateTimeFormat的选项对象中提供的   构造即可。但是,应用程序不应该依赖于此,作为未来   版本可能返回标识主机环境的String值   改为当前时区。

在ecma-402 / 3.0中,它仍然在草稿中变为

  

在此版本的ECMAScript 2015 Internationalization API中,   如果不是,timeZone属性将是默认时区的名称   提供给的选项对象中提供了timeZone属性   Intl.DateTimeFormat构造函数。之前的版本离开了   在这种情况下,timeZone属性未定义。

答案 2 :(得分:116)

我意识到这个答案有点偏离主题,但我想我们许多人在寻找答案时也希望格式化显示时区,也许也会得到区域缩写。所以这就是......

如果您希望客户端时区格式良好,您可以依赖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

答案 3 :(得分:69)

已经回答了如何以分钟为单位获得偏移量,但是如果有人希望将本地GMT偏移量作为字符串,例如"+1130"

function pad(number, length){
    var str = "" + number
    while (str.length < length) {
        str = '0'+str
    }
    return str
}

var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
          pad(parseInt(Math.abs(offset/60)), 2)+
          pad(Math.abs(offset%60), 2))

答案 4 :(得分:55)

您可以使用:

矩时区

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

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

浏览器时区检测相当棘手,因为浏览器提供的信息很少。

Moment Timezone在当前年份的一些时刻使用Date.getTimezoneOffset()Date.toString()来尽可能多地收集有关浏览器环境的信息。然后,它将该信息与加载的所有时区数据进行比较,并返回最接近的匹配。如果是关系,则返回人口最多的城市的时区。

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

答案 5 :(得分:38)

我在我的项目中编写了一个函数,该函数以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());

<强> Working Fiddle

答案 6 :(得分:12)

尝试getTimezoneOffset()对象的Date

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

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

答案 7 :(得分:9)

JavaScript的:

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

答案 8 :(得分:6)

使用moment.js

moment().format('zz');

答案 9 :(得分:5)

同时提供偏移量和时区的一种方法是简单地在新的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 TimeAmerica/Bogota

请注意,此问题的许多其他答案都试图通过调用Date.toString()获得相同的信息。这种方法并不可靠,就像MDN explains

  

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

     

toTimeString()方法特别有用,因为实现ECMA-262的兼容引擎在toString()对象的Date获得的字符串中可能有所不同,因为格式取决于实现;简单的字符串切片方法可能无法在多个引擎上产生一致的结果。

答案 10 :(得分:5)

使用,您可以找到当前时区

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>

使用,您可以找到当前时区

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>

两个API都以分钟为单位返回utc偏移量。

答案 11 :(得分:4)

以小时为单位的时区 -

SELECT  id,forename, surname, housenumber, street, town, county, postcode, phone  FROM contacts

如果你想要在评论中提到的那么精确,那么你应该尝试这样 -

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);

答案 12 :(得分:3)

如果您只需要“MST”或“EST”时区缩写:

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}

答案 13 :(得分:3)

尝试一下:

new Date().toLocaleString("en-US",Intl.DateTimeFormat().resolvedOptions().timeZone)

这将在客户端的浏览器中查找timeZone。

答案 14 :(得分:3)

看到这个结果运算符与时区相反。所以应用一些数学函数然后验证num更少或更多。

enter image description here

See the MDN document

&#13;
&#13;
var a = new Date().getTimezoneOffset();

var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;

console.log(res)
&#13;
&#13;
&#13;

答案 15 :(得分:3)

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

答案 16 :(得分:2)

new Date(上,您可以获得偏移量,以获取您可能执行的时区名称:

new Date().toString().replace(/(.*\((.*)\).*)/, '$2');

您在日期结束时获得()之间的值,即时区名称。

答案 17 :(得分:2)

这个值来自用户的机器,它可以随时更改,所以我觉得无关紧要,我只想获得一个近似值,然后将其转换为我服务器中的GMT。

例如,我来自台湾,它返回&#34; + 8&#34;对我来说。

when

<强> JS

function timezone() {
    var offset = new Date().getTimezoneOffset();
    var minutes = Math.abs(offset);
    var hours = Math.floor(minutes / 60);
    var prefix = offset < 0 ? "+" : "-";
    return prefix+hours;
}


$('#result').html(timezone());

<强> HTML

<div id="result"></div>

<强>结果

+8

答案 18 :(得分:1)

作为new Date().getTimezoneOffset()moment().format('zz')的替代方案,您还可以使用

var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>

jstimezone也非常缺陷且没有维护(https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open

答案 19 :(得分:1)

使用此选项将OffSet转换为postive:

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

答案 20 :(得分:1)

这将是我的解决方案:

A

答案 21 :(得分:1)

尝试一下

new Date().toString().split("GMT")[1].split(" (")[0]

答案 22 :(得分:0)

为什么不直接使用:

function timezoneOffset(date: Date) {
  return 6000 * ((date.getUTCHours() - date.getHours()) * 60 + ((date.getUTCMinutes() - date.getMinutes())))
}

答案 23 :(得分:0)

一旦我完成了这个“简单”任务,便使用了(new Date()).getTimezoneOffset()-这里广泛建议的方法。但是事实证明,解决方案并不正确。 在我的情况下,出于某些未记录的原因,new Date()返回的是 GMT + 0200 ,而new Date(0)返回的是 GMT + 0300 。从那以后我一直使用

(new Date(0)).getTimezoneOffset()以获得正确的时移。

答案 24 :(得分:0)

如果您只想要时区(例如IST,GMT等),请使用以下时间:

var timezone = new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1];
var parts = timezone.split(' ');
var tz = "";
parts.forEach(function (element) { tz += element.substring(0, 1); });

答案 25 :(得分:-2)

我一直在寻找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

答案 26 :(得分:-3)

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

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

答案 27 :(得分:-3)

您只需要包含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>

答案 28 :(得分:-4)

这将完成这项工作。

var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);
Thu May 25 2017 21:35:14 GMT+0300 (IDT)

未定义

答案 29 :(得分:-4)

你可以试试这个。 它会返回当前的机器时间

  

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