gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:09:30 25 4
gpt4 key购买 nike

你好,我现在使用时间值来存储时间,这取决于服务器时间,但我的网站将被全世界所有人使用,所以我试图自动检测用户时区。提前致谢

最佳答案

在大多数情况下,您不应该关心或不需要知道用户的时区来让您的网站正常运行。通常,您将所有内容以 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>

用户根据他们的时区在浏览器中看到格式正确的日期,而服务器不知道或不关心该时区,因为它使用与时区无关的时间戳进行传输。

但是,如果您希望出于传输以外的任何原因可靠地获取用户的时区(即您需要在服务器端应用转换),那么最好只询问用户。全部HTML5 capable browsers now have an Geolocation API支持从客户端 UA 收集准确的地理位置信息(这也适用于移动设备,因为您不能在移动设备中依赖地理位置 IP 信息)。还有一些 JavaScript 库,如 timezone-js可以根据PHP依赖的timezone db准确获取timezone。

执行此操作时要记住的重要一点是GMT 偏移量不足以了解时区,尤其是在 PHP 中。因为 PHP 依赖于 Olson timezone database identifier它提供的不仅仅是 GMT 偏移量。例如,在加拿大多伦多和美国纽约,当前的 GMT 偏移量是 -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 数据库的相同时区标识符。

关于php - 如何使用 php 或使用外部网站自动检测时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39555702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com