你好,我正在使用时间值来存储依赖于服务器时间的时间,但我的网站将被全球人士使用,因此我正在尝试自动检测用户的时区。谢谢。
<?php
$date = new DateTime("2016-09-18 4:45 AM", new DateTimezone("America/New_York"));
$timeStamp = $date->getTimeStamp();
?>
<script>
var timeStamp = <?=json_encode($timeStamp * 1000)?>;
alert(new Date(timeStamp);
</script>
-0400
。然而,在夏令时期间,两个时区的GMT偏移量都将变为-0500
。
还有更奇怪的情况,比如菲尼克斯和丹佛,这是亚利桑那州的两个城市,其中一个观察夏令时,另一个则不观察。因此,取决于一年中的哪个时候,它们可能处于相同的GMT偏移量,也可能不是。
$denver = new DateTime("now", new DateTimezone("America/Denver"));
$phoenix = new DateTime("now", new DateTimezone("America/Phoenix"));
var_dump($denver->format('c') , $phoenix->format('c'));
$denver->add(new DateInterval("P4M"));
$phoenix->add(new DateInterval("P4M"));
var_dump($denver->format('c'), $phoenix->format('c'));
上述代码的输出结果如下:
string(25) "2016-09-18T03:12:15-06:00" string(25) "2016-09-18T02:12:15-07:00" string(25) "2017-01-18T03:12:15-07:00" string(25) "2017-01-18T02:12:15-07:00"
因此,除非您想陷入存储GMT偏移并在不同时间错误应用该偏移而丢失有价值的时区信息的陷阱中,最好存储Olson tz标识符,PHP可以使用它来准确地应用时区转换而不会丢失信息。 timezone-js
库可以帮助您实现这一点,因为它依赖于与PHP相同的tz db的时区标识符。
Javascript:
var dateVar = new Date() var offset = d.getTimezoneOffset(); document.cookie = "offset="+offset;
PHP:
echo $_COOKIE['offset'];
Translated : 如何使用Javascript / PHP获取用户的时区字符串?
您可以使用IP地理定位技术从IP地址获取访问者的位置,然后获取时区值。虽然IP地理定位在位置查询方面可能不是100%准确,但这应该是您可以获得的最佳非侵入式解决方案。
如果您对此方法感兴趣,可以在http://lite.ip2location.com下载免费的IP到时区数据库。
你可以使用JavaScript来实现:
常用的JavaScript代码来检测访问者的时区是:
var myDate = new Date();
document.write(myDate.getTimezoneOffset());
基本上有两件事情需要弄清楚访问者的时区。首先,我们需要确定与格林威治标准时间(GMT)的时间偏移量。这可以通过创建两个日期(一个本地日期和一个GMT日期)并比较它们之间的时间差来轻松完成:
var rightNow = new Date();
var jan1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
var temp = jan1.toGMTString();
var jan2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var std_time_offset = (jan1 - jan2) / (1000 * 60 * 60);
var june1 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
temp = june1.toGMTString();
var june2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var daylight_time_offset = (june1 - june2) / (1000 * 60 * 60);
var dst;
if (std_time_offset == daylight_time_offset) {
dst = "0"; // daylight savings time is NOT observed
} else {
dst = "1"; // daylight savings time is observed
}