如何使用php自动检测时区或使用外部网站

如何使用php自动检测时区或使用外部网站,php,mysql,time,Php,Mysql,Time,您好,我现在使用time now值来存储时间,这取决于服务器时间,但我的网站将被世界各地的所有人使用,因此我尝试自动检测用户时区。提前谢谢 Javascript: var dateVar = new Date() var offset = d.getTimezoneOffset(); document.cookie = "offset="+offset; PHP: echo $_COOKIE['offset']; 原创:在大多数情况下,你不应该关心或需要知道用户的时区,这样你的网站才能正常运

您好,我现在使用time now值来存储时间,这取决于服务器时间,但我的网站将被世界各地的所有人使用,因此我尝试自动检测用户时区。提前谢谢

Javascript:

var dateVar = new Date() var offset = d.getTimezoneOffset();
document.cookie = "offset="+offset;
PHP:

echo $_COOKIE['offset'];

原创:

在大多数情况下,你不应该关心或需要知道用户的时区,这样你的网站才能正常运行。通常,您将所有内容都存储在服务器上的UTC(Unix时间戳)中,并将其传输到客户端。然后,使用javascript,让用户的客户端UA在本地处理时区转换

所以在PHP中类似这样的东西

<?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>
上面代码的输出给我们

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" 字符串(25)“2016-09-18T03:12:15-06:00” 字符串(25)“2016-09-18T02:12:15-07:00” 字符串(25)“2017-01-18T03:12:15-07:00” 字符串(25)“2017-01-18T02:12:15-07:00”
因此,除非您想通过存储GMT偏移量并在不同时间错误地应用它而陷入丢失有价值时区信息的陷阱,否则最好存储Olson tz标识符,PHP可以使用该标识符准确地应用时区转换,而不会丢失信息。
时区js
库可以帮助您实现这一点,因为它依赖于与PHP相同的来自tz db的时区标识符。

您可以使用java脚本:

用于检测访客时区的常见JavaScript是:

var myDate = new Date();
document.write(myDate.getTimezoneOffset());
基本上需要两件事来确定游客的时区。首先,我们需要确定格林威治标准时间(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);
您需要知道的第二件事是该位置是否遵守夏令时(DST)。由于DST总是在夏季观测,因此我们可以将1月份两个日期之间的时间偏移与6月份两个日期之间的时间偏移进行比较。如果偏移量不同,则我们知道该位置观察DST。如果偏移量相同,则我们知道该位置不符合DST

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
}

您可以使用IP地理定位技术从IP地址获取访问者的位置,然后获取时区值。虽然IP地理定位在位置查询中可能不会100%准确,但这将是您可能获得的最佳非侵入性解决方案


如果您对此方法感兴趣,可以将免费IP下载到时区数据库。

浏览器的时区信息不是http的一部分,您无法从标头获取。我认为你应该使用javascript,比如jsTimeZoneDetect库或php&javascript。为什么要投票?我最近实现了这个功能,它工作得很好。
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
}