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

Getting the client's timezone offset in JavaScript

如何收集访客的时区信息?我需要时区和格林尼治标准时间的时差。


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

</P >

The time-zone offset is the difference, in minutes, between UTC and local time. Note that this means that the offset is positive if the local timezone is behind UTC and negative if it is ahead. For example, if your time zone is UTC+10 (Australian Eastern Standard Time), -600 will be returned. Daylight savings time prevents this value from being a constant even for a given locale

  • Mozilla的Date对象的参考

注意,这不全是用全时区偏移时间的:例如,纽芬兰是零下UTC(3H 30m离开daylight节省时间的方程)。 </P >


使用的偏移量的calculate时区是一个错误的方法,你将永远encounter问题。时间区和daylight节约型规则的变化可能是几种occasions工作一年,和它的复杂的保持与变化。 </P >

对得到的系统的时区在IANA的JavaScript,你应该使用 </P >

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

</P >

As of马奇2019年,本厂在90 %的browsers用于全球。它并不工作在Internet Explorer。 </P > 在相容性信息

ECMA 402 / 1.0 timeZone说这可能会undefined如果不提供的constructor。。。。。。。但是,在未来的草案(3.0),通过定点问题的变化对系统的默认时区。 </P >

In this version of the ECMAScript Internationalization API, the
timeZone property will remain undefined if no timeZone property was
provided in the options object provided to the Intl.DateTimeFormat
constructor. However, applications should not rely on this, as future
versions may return a String value identifying the host environment’s
current time zone instead.

在ECMA 402 / 3.0这是它在一个草案,它改变了的 </P >

In this version of the ECMAScript 2015 Internationalization API, the
timeZone property will be the name of the default time zone if no
timeZone property was provided in the options object provided to the
Intl.DateTimeFormat constructor. The previous version left the
timeZone property undefined in this case.


我realize这个答案是一个位的通断的主题,但我想象许多我们寻找的答案也想对格式的时间显示区和get方法,严格讲来或许全在区abbreviation太。。。。。。。所以在这里,它是………………… </P >

如果你想在客户端的时区nicely formatted你可以rely是JavaScript和date.tostring方法做: </P >

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

这会给你的"格林尼治标准时间(美国东部时间),美国的"for example,包括《时区分钟当适用。 </P >

alternatively与正则表达式,你可以提任何desired部分: </P >

用"格林威治标准时间(美国edt)": </P >

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

"GMT 0400": </P >

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

的方法是"edt": </P >

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

设计的是"美国": </P >

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

date.tostring参考:http:/ / / /我developer.mozilla.org JavaScript /参考/全球_ /日期/对象的ToString </P >


它的已经被回答如何得到偏移在分钟为一个整数,但在任何个案的各种地方格林尼治标准时间偏移量为一个字符串,例如:"+1130" </P >

1
2
3
4
5
6
7
8
9
10
11
12
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))


你可以使用: </P > 矩的时区

1
2
3
4
5
<script src="moment.js">
<script src="moment-timezone-with-data.js">

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

浏览器时,检测区是狡猾的get为右键,有小的信息,只要通过浏览器。 </P >

不使用的时区Date.getTimezoneOffset()Date.toString()是一部handful矩不是目前的年收集的信息?为更多的浏览器环境作为可能的。然后,它compares信息与所有的时间区和数据加载时返回的closest火柴。在不知道的情况下,的时间区与市与最大的人口是returned。。。。。。。 </P >

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


第一封函数在我的项目,这在hh:mm时区时返回的格式。我希望这可以帮助的人: </P >

1
2
3
4
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);
}
1
// Outputs: +5:00

1
2
3
4
5
6
7
8
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());

</P >

小提琴的工作 </P >


试着getTimezoneOffset()Date面向: </P >

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

这一方法时返回时区偏移在分钟之间的差分,这是格林威治标准时间和本地时间中的分钟。 </P >


详细说明: </P >

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

</P >


与moment.js: </P >

1
moment().format('zz');


与momentjs,你能找到的时区为流 </P >

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

</P >

与dayjs,你能找到的时区为流 </P >

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

</P >

纸的API时返回UTC偏移在分钟。 </P >

  • DOC的时刻
  • dayjs DOC


时区(小时)-

1
2
3
4
5
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);

如果你想像你在评论中提到的那样精确,那么你应该这样做。-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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));
}


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

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


一个同时提供偏移量和时区的一行程序就是简单地对一个新的日期对象调用toTimeString()。来自MDN:

The toTimeString() method returns the time portion of a Date object in human readable form in American English.

关键是时区不是标准的IANA格式;它比"洲/城市"IANA格式更易于用户使用。试一试:

1
2
3
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所解释的那样,这种方法并不可靠:

Date instances refer to a specific point in time. Calling toString() will return the date formatted in a human readable form in American English. [...] Sometimes it is desirable to obtain a string of the time portion; such a thing can be accomplished with the toTimeString() method.

The toTimeString() method is especially useful because compliant engines implementing ECMA-262 may differ in the string obtained from toString() for Date objects, as the format is implementation-dependent; simple string slicing approaches may not produce consistent results across multiple engines.


1
2
3
4
5
6
7
8
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


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

enter image description here

参见MDN文档

1
2
3
4
5
6
var a = new Date().getTimezoneOffset();

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

console.log(res)


new Date(上,您可以获取偏移量,以获取时区名称,您可以执行以下操作:

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

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


这个值是从用户的机器,它可以anytime变了,所以我认为它不' t物,我只想得到的近似值,然后转化到格林尼治标准时间,它在我的服务器。 </P >

例如,我是从台湾和它时返回"8"我们的。 </P >

工作实例 </P >

js </P >

1
2
3
4
5
6
7
8
9
10
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 </P >

1
 

结果 </P >

1
+8

作为一种替代的new Date().getTimezoneOffset()moment().format('zz'),你也可以使用momentjs: </P >

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

</P >

jstimezone是也quite小车和没人维护(https:bitbucket.org / / / / / pellepim jstimezonedetect问题???????在现状= = &;我打开) </P >


使用此选项可将偏移量转换为postive:

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


试试这个,

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

我是在找是3个字母的字符串(类"PDT")和试过马尔克斯的答案,但有一位tweak到它的跨浏览器的支持。luckily,字符串是"最后的潜能:match) </P >

在这里,我做的是什么,在coffeescript: </P >

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

工厂在IE8,IE9的Firefox,Safari 9、44、48和铬 </P >


您只需包括moment.js和jstz.js

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

之后

1
2
3
4
5
$(function(){
 var currentTimezone = jstz.determine();
 var timezone = currentTimezone.name();
 alert(timezone);
});

这对我来说很好:

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


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

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


这就行了。

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

未定义