如何收集访客的时区信息?我需要时区以及GMT抵消时间。
答案 0 :(得分:498)
var offset = new Date().getTimezoneOffset();
console.log(offset);
时区偏移是UTC与本地时间之间的差异(以分钟为单位)。请注意,这意味着如果本地时区落后于UTC,则偏移量为正,如果前置,则偏移量为负。例如,如果您的时区是UTC + 10(澳大利亚东部标准时间),则将返回-600。夏令时可以防止该值即使对于给定的区域设置也是常量
请注意,并非所有时区都按整个小时偏移:例如,纽芬兰是UTC减去3小时30分钟(将夏令时留在等式中)。
答案 1 :(得分:311)
使用偏移来计算时区是一种错误的方法,您将始终遇到问题。时区和夏令时规则可能会在一年内多次改变,并且很难跟上变化。
要在JavaScript中获取系统的IANA timezone,您应该使用
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
截至2019年3月,这works in 90% of the browsers used globally。它not的作用Internet Explorer。
ecma-402 / 1.0表示如果没有提供给构造函数,timeZone
可能是未定义的。但是,未来的草案(3.0)通过更改为系统默认时区来解决该问题。
在此版本的ECMAScript Internationalization API中, 如果没有
timeZone
属性,timeZone
属性将保持未定义 提供给Intl.DateTimeFormat
的选项对象中提供的 构造即可。但是,应用程序不应该依赖于此,作为未来 版本可能返回标识主机环境的String值 改为当前时区。
在ecma-402 / 3.0中,它仍然在草稿中变为
在此版本的ECMAScript 2015 Internationalization API中, 如果不是,
timeZone
属性将是默认时区的名称 提供给的选项对象中提供了timeZone
属性Intl.DateTimeFormat
构造函数。之前的版本离开了 在这种情况下,timeZone
属性未定义。
答案 2 :(得分:116)
我意识到这个答案有点偏离主题,但我想我们许多人在寻找答案时也希望格式化显示时区,也许也会得到区域缩写。所以这就是......
如果您希望客户端时区格式良好,您可以依赖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
答案 3 :(得分:69)
已经回答了如何以分钟为单位获得偏移量,但是如果有人希望将本地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))
答案 4 :(得分:55)
您可以使用:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
浏览器时区检测相当棘手,因为浏览器提供的信息很少。
Moment Timezone在当前年份的一些时刻使用Date.getTimezoneOffset()
和Date.toString()
来尽可能多地收集有关浏览器环境的信息。然后,它将该信息与加载的所有时区数据进行比较,并返回最接近的匹配。如果是关系,则返回人口最多的城市的时区。
console.log(moment.tz.guess()); // America/Chicago
答案 5 :(得分:38)
我在我的项目中编写了一个函数,该函数以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());
<强> Working Fiddle 强>
答案 6 :(得分:12)
尝试getTimezoneOffset()
对象的Date
:
var curdate = new Date()
var offset = curdate.getTimezoneOffset()
此方法以分钟为单位返回时区偏移量,即GMT与当地时间之间的差值(以分钟为单位)。
答案 7 :(得分:9)
JavaScript的:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
答案 8 :(得分:6)
使用moment.js:
moment().format('zz');
答案 9 :(得分:5)
同时提供偏移量和时区的一种方法是简单地在新的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 explains:
日期实例指的是特定时间点。调用toString()将以人类可读的格式返回使用美国英语格式的日期。 [...]有时需要获取时间部分的字符串;这样的事情可以通过
toTimeString()
方法来完成。
toTimeString()
方法特别有用,因为实现ECMA-262的兼容引擎在toString()
对象的Date
获得的字符串中可能有所不同,因为格式取决于实现;简单的字符串切片方法可能无法在多个引擎上产生一致的结果。
答案 10 :(得分:5)
使用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偏移量。
答案 11 :(得分:4)
以小时为单位的时区 -
SELECT id,forename, surname, housenumber, street, town, county, postcode, phone FROM contacts
如果你想要在评论中提到的那么精确,那么你应该尝试这样 -
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);
答案 12 :(得分:3)
如果您只需要“MST”或“EST”时区缩写:
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
答案 13 :(得分:3)
尝试一下:
new Date().toLocaleString("en-US",Intl.DateTimeFormat().resolvedOptions().timeZone)
这将在客户端的浏览器中查找timeZone。
答案 14 :(得分:3)
看到这个结果运算符与时区相反。所以应用一些数学函数然后验证num更少或更多。
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
&#13;
答案 15 :(得分:3)
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
答案 16 :(得分:2)
在new Date(
上,您可以获得偏移量,以获取您可能执行的时区名称:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
您在日期结束时获得()
之间的值,即时区名称。
答案 17 :(得分:2)
这个值来自用户的机器,它可以随时更改,所以我觉得无关紧要,我只想获得一个近似值,然后将其转换为我服务器中的GMT。
例如,我来自台湾,它返回&#34; + 8&#34;对我来说。
<强> 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
答案 18 :(得分:1)
作为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)
答案 19 :(得分:1)
使用此选项将OffSet转换为postive:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
答案 20 :(得分:1)
这将是我的解决方案:
A
答案 21 :(得分:1)
尝试一下
new Date().toString().split("GMT")[1].split(" (")[0]
答案 22 :(得分:0)
为什么不直接使用:
function timezoneOffset(date: Date) {
return 6000 * ((date.getUTCHours() - date.getHours()) * 60 + ((date.getUTCMinutes() - date.getMinutes())))
}
答案 23 :(得分:0)
一旦我完成了这个“简单”任务,便使用了(new Date()).getTimezoneOffset()
-这里广泛建议的方法。但是事实证明,解决方案并不正确。
在我的情况下,出于某些未记录的原因,new Date()
返回的是 GMT + 0200 ,而new Date(0)
返回的是 GMT + 0300 。从那以后我一直使用
(new Date(0)).getTimezoneOffset()
以获得正确的时移。
答案 24 :(得分:0)
如果您只想要时区(例如IST,GMT等),请使用以下时间:
var timezone = new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1];
var parts = timezone.split(' ');
var tz = "";
parts.forEach(function (element) { tz += element.substring(0, 1); });
答案 25 :(得分:-2)
我一直在寻找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
答案 26 :(得分:-3)
这对我来说是非常好的工作:
// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
答案 27 :(得分:-3)
您只需要包含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>
答案 28 :(得分:-4)
这将完成这项工作。
var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);
Thu May 25 2017 21:35:14 GMT+0300 (IDT)
未定义
答案 29 :(得分:-4)
你可以试试这个。 它会返回当前的机器时间
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())