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

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

飞云卡卡西神乐2020/03/12 10:38:47

这样就可以了。


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 10:38:46

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

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

宝儿理查德村村2020/03/12 10:38:46

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

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
前端猪猪GO2020/03/12 10:38:46

您只需要包含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>
神乐Pro2020/03/12 10:38:46

我只是在寻找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 10:38:46

这是我的解决方案:


    // 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 10:38:46

使用此将OffSet转换为正值:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
卡卡西Mandy2020/03/12 10:38:46

尝试这个,

new Date().toString().split("GMT")[1].split(" (")[0]
HarryTom2020/03/12 10:38:46
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

2020/03/12 10:38:46

时区(以小时为单位)

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 10:38:46

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 10:38:46

JavaScript:

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

路易伽罗2020/03/12 10:38:46

提供偏移量和时区的单线是简单地在新的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 10:38:46

尝试getTimezoneOffset()Date对象:

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

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

小卤蛋小卤蛋小哥2020/03/12 10:38:46

我在项目中编写了一个函数,该函数以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 10:38:45

您可以使用:

时区

<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
TomProSam2020/03/12 10:38:45

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

如果您希望客户端时区的格式正确,则可以依靠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 10:38:45

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

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

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