Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从浏览器获取客户端时区_Javascript_Http_Browser_Timezone - Fatal编程技术网

Javascript 从浏览器获取客户端时区

Javascript 从浏览器获取客户端时区,javascript,http,browser,timezone,Javascript,Http,Browser,Timezone,是否有可靠的方法从客户端浏览器获取时区?我看到了以下链接,但我想要一个更健壮的解决方案 查看此存储库,它很有帮助 下载jstz.min.js并在html页面中添加一个函数 <script language="javascript"> function getTimezoneName() { timezone = jstz.determine() return timezone.name(); } </script> 函

是否有可靠的方法从客户端浏览器获取时区?我看到了以下链接,但我想要一个更健壮的解决方案

查看此存储库,它很有帮助

下载jstz.min.js并在html页面中添加一个函数

<script language="javascript">
    function getTimezoneName() {
        timezone = jstz.determine()
        return timezone.name();
    }
</script>

函数getTimezoneName(){
时区=jstz.determine()
返回timezone.name();
}

并从显示标签调用此函数。没有单一可靠的方法,也永远不会有。您真的认为您可以信任客户吗?

目前,最好的选择可能是中建议的jstz

为了完整性,应该提到的是,在这方面有一个标准:。您可以在Chrome中看到这一点:

> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"
(这实际上并不符合标准,这是坚持使用库的另一个原因)

以下是一个

它提供当前用户时区的缩写

下面是代码示例

var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));

通常,当人们寻找“时区”时,只要“UTC偏移量”就足够了。e、 例如,他们的服务器是UTC+5,他们想知道他们的客户机是在UTC-8下运行的


在普通的旧javascript
(new Date())中。getTimezoneOffset()/60
将返回当前与UTC的小时偏移量

值得注意的是,
getTimezoneOffset()
返回值的符号中可能有一个“gotcha”:

时区偏移是UTC和本地时间之间的差,以分钟为单位。请注意,这意味着如果本地时区在UTC之后,则偏移量为正,如果在UTC之前,则偏移量为负。例如,对于时区UTC+10:00(澳大利亚东部标准时间、符拉迪沃斯托克时间、查莫罗标准时间),将返回-600


但是,我建议您使用与时间/日期相关的Javascript代码。在这种情况下,您可以通过运行以下命令获得ISO 8601格式的UTC偏移:

> dayjs().format("Z")
"-08:00"
值得一提的是,客户很容易伪造这些信息


(注意:这个答案最初是推荐的,但dayjs是一个更现代、更小的选择。)

我使用了一种类似的方法,它确定浏览器与UTC的时间偏移,以及它是否识别DST(但从他的代码中稍微简化):

var ClientTZ={
UTCoffset:0,//浏览器与UTC的时间偏移量(分钟)
UTCoffsetT:“+0000S”,//浏览器与UTC的时间偏移量,格式为“±hhmmD”
hasDST:false,//浏览器时间观察到DST
//确定浏览器的时区和DST
getBrowserTZ:函数(){
var-self=clientz;
//确定UTC时间偏移
var now=新日期();
var date1=新日期(now.getFullYear(),1-1,1,0,0,0);/Jan
var diff1=-date1.getTimezoneOffset();
self.UTCoffset=diff1;
//确定DST的使用
var date2=新日期(now.getFullYear(),6-1,1,0,0,0);//Jun
var diff2=-date2.getTimezoneOffset();
if(diff1!=diff2){
self.hasDST=true;
如果(diff1-diff2>=0)
self.UTCoffset=diff2;//GMT以东
}
//将UTC偏移量转换为±hhmmD形式
diff2=(diff1<0?-diff1:diff1)/60;
var hr=数学楼层(diff2);
var min=diff2-hr;
差值2=小时*100+分钟*60;
self.utcoffset=(diff1<0?'-':'+)+(hr<10?'0':')+diff2.toString()+(self.hasDST'D':'S');
返回self.UTCoffset;
}
};
//装载
ClientTZ.getBrowserTZ();
加载后,执行
ClientTZ.getBrowserTZ()
函数,该函数设置:

  • ClientTZ.UTCoffset
    到浏览器时间与UTC的偏移量(以分钟为单位)(例如,CST为−360分钟,也就是说−距离UTC 6.0小时)
  • ClientTZ.UTCoffsetT
    到偏移量,格式为
    “±hhmmD”
    (例如,
    '-0600D'
    ),其中对于DST后缀为
    D
    ,对于标准(非DST)后缀为
    S
  • ClientTZ.hasDST
    (对或错)
ClientTZ.UTCoffset
以分钟而不是小时为单位提供,因为某些时区具有分数小时偏移量(例如,+0415)


ClientTZ.utcoffset
背后的意图是将其用作时区表(此处未提供)的键,例如用于下拉列表。

五年后,我们有了一种内置的方法! 对于现代浏览器,我将使用:

const tz=Intl.DateTimeFormat().resolvedOptions().timeZone;
控制台日志(tz)您可以用来猜测时区:

> moment.tz.guess()
"America/Asuncion"

下面是一个版本,它在2020年9月使用fetch和

fetch(“https://worldtimeapi.org/api/ip")
.then(response=>response.json())

.then(data=>console.log(data.timezone,data.datetime,data.dst))我编写了您上面链接到的jsTimezoneDetect,我对这种情况的看法是,它与纯跨浏览器javascript(没有地理位置和IP查找)尽可能接近,或者,他们可能恶意地试图欺骗你,让你认为他们与实际生活在不同的时区。如果你要使用客户的时区,不要做任何重要的事情。-1因为你给出了一个潜在的误导性答案而没有澄清。是的,对于我的申请,我可以信任客户。如果客户端配置错误或有bug,那是我的用户的问题。我同意Florian的观点。可靠的方法?有点可靠的数据?当然不是。问题并不是说这些数据将如何使用。例如,它并没有说检测到的时区将被提交到服务器。因此,如果数据纯粹在本地使用,那么关于信任的评论就无关紧要了。除了Safari,Intl在所有方面看起来都很稳定@
Intl
的符合MichaelCole的实现应该返回
未定义的
时区
> moment.tz.guess()
"America/Asuncion"