【问题标题】:How to display localized time, based on a visitor's location?如何根据访问者的位置显示本地化时间?
【发布时间】:2012-05-12 01:34:42
【问题描述】:

我们正在开发一个网站,供世界各地的人们使用。网站中有一个聊天部分,我们希望消息显示带有时间戳。我在数据库中存储每条消息的时间戳。

根据访问者的当地时间,如何向访问者显示每条消息的正确时间。

我不想询问用户他的时区。有没有办法做到这一点,只使用 PHP?如果不是 - 根据访问者的当前时间,使用 javascript 显示当前时间的方式是什么?

【问题讨论】:

  • 在前端使用Javascript获取服务器时间戳,计算并打印本地时间。如果您存储的服务器时间戳是 UTC+0 会更容易。

标签: php javascript localization timezone


【解决方案1】:

最简单的方法是让浏览器告诉你的脚本用户的时间和区域是什么。例如:-

<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 中的本地时间。

【讨论】:

    【解决方案2】:

    如果有人想在访问者的系统时区显示 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};
        }
    

    【讨论】:

      【解决方案3】:

      PHP 是一种服务器端脚本语言,因此您无法获取访问者的当地时间,除非您使用 GeoIP。您应该改用 JavaScript。

      【讨论】:

        【解决方案4】:

        在用户 PC 上准确显示时间设置的唯一有保证的方法是使用 JavaScript。您可以尝试服务器端地理检测,但数据库从来都不是完美的,或者用户很可能是来自完全不同时区的某个提供商的远程客户端。以 Unix 纪元时间的秒数发送时间戳,然后在 JavaScript 中用这个时间初始化 Date object,并使用它的 .get(没有 UTC)方法来检索用户本地表示中的相应时间片段。为用户提供使用某个特定时区的选项,以防他出于某种原因想要覆盖本地时间也是一个好主意。

        【讨论】:

          【解决方案5】:

          正如其他答案所说,Javascript 是正确的技术,但是如果您坚持使用 php,那么一种可能的方法是使用地理定位库或服务来定位猜测 IP 地址的时区.

          然而,这始终是最佳猜测解决方案,并且在许多情况下,访问者来自的 IP 地址可能与用户当前所在的时区不一致。

          【讨论】:

          • 如果需要,我已经准备好使用 javascript。正如您可能猜到的那样,我不想依赖地理位置跟踪。
          【解决方案6】:

          如果您知道用户的 IP 地址 ($_SERVER['REMOTE_ADDR']),您可以使用 PHP 完成此操作。 查看 Geo-IP (http://php.net/manual/en/book.geoip.php) 以获取匹配位置ip-address

          如果(例如)他/她在代理后面,则 IP 地址不一定反映用户的“真实”位置。在使用移动设备 (GPRS/edge/3G/HSDPA) 时,我还看到了一些奇怪的行为。

          【讨论】:

          • 我将跳过地理定位跟踪 - 它不准确,如果它在我的服务器上并且大部分 API 都是付费的,则需要大量空间和时间(在数据库中)。我将寻找一种使用 javascript 和服务器时间戳的方法。
          【解决方案7】:

          我不知道如何在 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

          另请注意,这当然是基于用户的计算机时间设置。它不会根据用户的网络地址检查用户的全球位置。如果您真的想这样做,请忽略我的回答:)

          【讨论】:

          • 我需要同样的东西,但要根据服务器返回的时间戳来计算。
          【解决方案8】:

          您可以使用地理 IP 对用户时区进行有根据的猜测

          http://php.net/manual/en/book.geoip.php

          或者你可以使用javascript:

          http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/

          【讨论】:

          • 这是我使用的: var date = new Date(Date.UTC(year,month,day,hour,minute)); $('#'+selector).html ((date.getHours()>9?date.getHours():('0'+date.getHours())) + ':' + (date.getMinutes()> 9?date.getMinutes():('0'+date.getMinutes())) );其中年、月、日、小时、分钟由服务器从数据库中传递。
          • stackoverflow.com/a/62344221/12910765 这可能有助于在访问者的时区显示 php 现在时间
          猜你喜欢
          • 2012-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-10
          • 2019-09-26
          • 1970-01-01
          • 1970-01-01
          • 2019-07-26
          相关资源
          最近更新 更多