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

2020/09/22 22:01 · javascript ·  · 0评论

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

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

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

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

使用偏移量来计算时区是错误的方法,并且您总是会遇到问题。时区和夏时制规则可能在一年中多次更改,因此很难跟上这些更改。

使用JavaScript 获取系统的IANA时区,您应该使用

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

截至2019年9月,此方法可在全球95%的浏览器中使用

旧的兼容性信息

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

在此版本的ECMAScript国际化API中,timeZone如果timeZone提供给Intl.DateTimeFormat
构造函数
的options对象中未提供任何属性,则该
属性将保持未定义状态
但是,应用程序不应依赖于此,因为将来的版本可能会返回一个String值,该值标识主机环境的当前时区。

在仍处于草案中的ecma-402 / 3.0中,将其更改为

在此版本的ECMAScript 2015 Internationalization API中,timeZone如果timeZone提供给Intl.DateTimeFormat构造函数的options对象中未提供任何属性
,则该
属性将为默认时区的名称
timeZone在这种情况下,以前的版本使
属性未定义。

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

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

已经有人回答过如何以分钟为单位获取整数的偏移量,但是如果有人希望将本地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))

您可以使用:

时区

<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

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

工作小提琴

同时提供偏移量和时区的单行代码是简单地在新的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而国际API返回America/Los_Angeles在哥伦比亚,你会得到Colombia Standard Time,主场迎战America/Bogota

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

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

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

尝试getTimezoneOffset()Date对象:

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

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

JavaScript:

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

随着moment.js

moment().format('zz');

,您可以找到当前时区为

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偏移量。

时区(以小时为单位)

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

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

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

看到此结果运算符与时区相反。因此,应用一些数学函数,然后对num进行更少或更多的验证。

在此处输入图片说明

参阅MDN文件

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

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

console.log(res)
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

试试这个,

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

该值来自用户的计算机,可以随时更改,因此我认为这无关紧要,我只想获取一个近似值,然后在服务器中将其转换为GMT。

例如,我来自台湾,它为我返回“ +8”。

工作实例

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

在上,new Date(您可以获取偏移量,以获取时区名称:

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

您将获得()日期末尾之间的值,即时区的名称。

这是我的解决方案:


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



作为一种替代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

使用此将OffSet转换为正值:

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

我只是在寻找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中使用

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

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

// 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())

这样就可以了。


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

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

未定义

本文地址:http://javascript.askforanswer.com/zaijavascriptzhonghuoqukehuduandeshiqupianyiliang.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!