我们正在开发一个网站,它将被世界各地的人们使用。网站中有一个聊天部分,我们希望消息显示带有时间戳。我在数据库中存储每条消息的时间戳。
根据访问者的当地时间,向访问者显示每条消息的正确时间的方法是什么。
我不想向用户询问他的时区。有没有办法做到这一点,只使用 PHP?如果不是 - 根据访问者的当前时间,使用 javascript 显示当前时间的方法是什么?
我们正在开发一个网站,它将被世界各地的人们使用。网站中有一个聊天部分,我们希望消息显示带有时间戳。我在数据库中存储每条消息的时间戳。
根据访问者的当地时间,向访问者显示每条消息的正确时间的方法是什么。
我不想向用户询问他的时区。有没有办法做到这一点,只使用 PHP?如果不是 - 根据访问者的当前时间,使用 javascript 显示当前时间的方法是什么?
您可以使用地理 IP 对用户时区进行有根据的猜测
http://php.net/manual/en/book.geoip.php
或者你可以使用 javascript:
http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/
如果您知道用户 IP 地址 ($_SERVER['REMOTE_ADDR']),您可以使用 PHP 完成此操作。查看 Geo-IP ( http://php.net/manual/en/book.geoip.php ) 以获取匹配位置<->ip-address
如果(例如)他/她在代理后面,则 IP 地址不一定反映用户的“真实”位置。在使用移动设备 (GPRS/edge/3G/HSDPA) 时,我还看到了一些奇怪的行为。
在用户 PC 上准确显示时间设置的唯一有保证的方法是使用 JavaScript。您可以尝试服务器端地理检测,但数据库从来都不是完美的,或者用户很可能是来自完全不同时区的某个提供商的远程客户端。以 Unix 纪元时间的秒数发送时间戳,然后用这个时间在 JavaScript 中初始化Date
对象,并使用它的 .get(没有 UTC)方法以用户的本地表示形式检索相应的时间片段。为用户提供使用某些特定时区的选项,以防他出于某种原因想要覆盖本地时间也是一个好主意。
我不知道如何在 PHP 中执行此操作,但是由于您也在询问 javascript,因此您可以使用该Date
对象。
var d = new Date(); // creates a Date object and initializes it with
// user's current time
d.getTimezoneOffset(); // time zone offset in minutes
d.getDay();
d.getHours();
/* etc... gets information about the user's local time */
完整参考:http ://www.w3schools.com/jsref/jsref_obj_date.asp
另请注意,这当然是基于用户的计算机时间设置。它不会根据用户的网络地址检查用户的全球位置。如果您真的想这样做,请忽略我的回答:)
正如其他答案所说,Javascript 是正确的技术,但是如果您坚持使用 php,那么一种可能的方法是使用地理定位库或服务来定位猜测 IP 地址的时区。
然而,这将始终是最佳猜测解决方案,并且在许多情况下,访问者来自的 IP 地址可能与用户当前所在的时区不一致。
如果有人想在访问者的系统时区显示 PHP 时间
<?php
$now = new DateTime();
$date_created=$now->format('Y-m-d H:i:s');
$contents = htmlentities("<script>var x=new Date('$date_created' +'+0000');document.write(x.getMonth() + '-' + x.getDate() + '-' + x.getFullYear()+ ' ' + x.getHours() + ':' + x.getMinutes());</script>");
echo html_entity_decode($contents);
?>
这将在访问者的时区显示服务器时间。如果您将服务器时间设置为 UTC +00。如果有人想要更改格式,可以使用此 javascript 函数
function detectAmPm(hours, min) {
let time;
if (hours >= 12) {
time = "PM";
hours = hours - 12
} else {
time = "AM";
}
if (hours < 10) {
hours = "0" + hours;
}
if (min < 10) {
min = "0" + min;
}
return {min: min, hours: hours, time: time};
}
最简单的方法是让浏览器告诉你的脚本用户的时间和区域是什么。例如:-
<input name=tz type-hidden id=tz><script>document.getElementById("tz").value=new Date;</script>
然后,您的 PHP 将在下次他们向您的聊天发送任何内容时获取他们当前的时间和时区:例如
'2021 年 11 月 3 日星期三 09:21:01 GMT+1000(澳大利亚东部标准时间)'
然后,您可以使用 GMT+xxx 代码将您的服务器时间转换为 PHP 中的本地时间。
PHP 是一种服务器端脚本语言,因此除非您使用 GeoIP,否则您无法获取访问者的本地时间。您应该改用 JavaScript。