如何收集访问者的时区信息?我需要时区以及GMT偏移时间。
在JavaScript中获取客户端的时区偏移量
您可以尝试一下。它将返回您当前的机器时间
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
这对我来说是非常好的工作:
// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
您只需要包含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>
我只是在寻找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中使用
这是我的解决方案:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
使用此将OffSet转换为正值:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
尝试这个,
new Date().toString().split("GMT")[1].split(" (")[0]
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
时区(以小时为单位)
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));
}
With momentjs, 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 dayjs, 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.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
提供偏移量和时区的单线是简单地在新的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
对象,该格式是与实现有关的; 简单的字符串切片方法可能无法在多个引擎上产生一致的结果。
尝试getTimezoneOffset()
的Date
对象:
var curdate = new Date()
var offset = curdate.getTimezoneOffset()
此方法返回以分钟为单位的时区偏移量,这是GMT与本地时间(以分钟为单位)之间的差。
我在项目中编写了一个函数,该函数以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());
您可以使用:
时区
<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
我意识到这个答案有点离题,但我想我们中许多人正在寻找一个答案,他们也想格式化显示的时区,也许还要获得时区缩写。所以就这样...
如果您希望客户端时区的格式正确,则可以依靠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
var offset = new Date().getTimezoneOffset();
console.log(offset);
时区偏移量是UTC与本地时间之间的差(以分钟为单位)。请注意,这意味着如果本地时区在UTC之后,则偏移量为正;如果在本地时区之前,则偏移量为负。例如,如果您的时区是UTC + 10(澳大利亚东部标准时间),则将返回-600。夏时制即使在给定的语言环境下也可以防止该值保持恒定
请注意,并非所有时区都被整个小时抵消:例如,纽芬兰是UTC减去3h 30m(将夏令时排除在外)。
这样就可以了。
未定义