如何收集访问者的时区信息?我需要时区以及GMT偏移时间。
如何收集访问者的时区信息?我需要时区以及GMT偏移时间。
Answers:
var offset = new Date().getTimezoneOffset();
console.log(offset);
时区偏移量是UTC与本地时间之间的差(以分钟为单位)。请注意,这意味着如果本地时区在UTC之后,则偏移量为正;如果在本地时区之前,则偏移量为负。例如,如果您的时区是UTC + 10(澳大利亚东部标准时间),则将返回-600。夏时制即使在给定的语言环境下也可以防止该值保持恒定
请注意,并非所有时区都可以被整个小时抵消:例如,纽芬兰是UTC减去3h 30m(将夏令时排除在外)。
getTimezoneOffset
不准确性的声明是否有效?您所指的文章的日期为2007年6月,没有详细介绍该功能的准确性。实际上,jsTimezoneDetect
您指向的库会使用getTimezoneOffset
它自己。
var hrs = -(new Date().getTimezoneOffset() / 60)
抵消通常使用的小时数
timezone
!=utc offset
使用偏移量来计算时区是错误的方法,并且您总是会遇到问题。一年中的时区和夏时制规则可能会多次更改,因此很难跟上这些更改。
要使用JavaScript 获取系统的IANA时区,您应该使用
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
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
split[4] + " " + split[5]
?!
split
包含:["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
所以结果是Daylight Time)
new 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))
pad(parseInt(Math.abs(offset/60)), 2)
以使其正确...否则您可能最终得到+5.530,就像我的情况...我不确定数学地板等在这里是否会更好....但这atleast给了我+0530如预期的那样
您可以使用:
<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
对象,该格式是与实现有关的; 简单的字符串切片方法可能无法在多个引擎上产生一致的结果。
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
随着moment.js:
moment().format('zz');
Z
和ZZ
用 momentjs,您可以找到当前时区为
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>
用 dayjs,您可以找到当前时区为
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偏移量。
getTimezoneOffset()
。
时区(以小时为单位)
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;
}
Date.toString()
不可靠,MDN解释了原因。我已经在他们的答案中粘贴了他们文档中的相关部分。
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(印度标准时间)
输电话:+0530
Date.toString()
不可靠,MDN解释了原因。我已经在他们的答案中粘贴了他们文档中的相关部分。
该值来自用户的计算机,可以随时更改,因此我认为这无关紧要,我只想获取一个近似值,然后在服务器中将其转换为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');
您将获得()
日期末尾之间的值,即时区的名称。
Date.toString()
不可靠,MDN解释了原因。我已经在他们的答案中粘贴了他们文档中的相关部分。而且,这个答案已经至少给出了3次。
这是我的解决方案:
// 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')
,你也可以使用momentjs:
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中使用
Date.toString()
不可靠,MDN解释了原因。我已经在他们的答案中粘贴了他们文档中的相关部分。
您只需要包含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>