【问题标题】:How to display php server time and timezone correctly in JS / jQuery independent of user location?如何在 JS / jQuery 中独立于用户位置正确显示 php 服务器时间和时区?
【发布时间】:2015-02-12 11:45:58
【问题描述】:

首先,我很抱歉提出另一个与网络相关的时间和时区问题。我知道有很多资源和类似的问题,但我仍然无法理解 php 和 js 时间之间的时间转换是如何工作的。

这就是我的情况。我想将包括时区在内的服务器时间转换为 javascript 并在客户端执行某些操作(与此问题无关)。我有这个短的 sn-p 不能像我期望的那样工作:

get_date.php

<?php
date_default_timezone_set('Romania/Bucharest');
echo date('D M d Y H:i:s');
?>

index.html

<body>

  <!-- jQuery -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>

  <script type='text/javascript'>

  $.get( "get_date.php", function(data) {
    current = new Date(data);
    alert(current);
  });

  </script>

</body>

警报信息

所以问题是我得到了罗马尼亚的日期和时间(服务器的位置),但是柏林的偏移量和时区(我访问网站的位置)。我想在 Javascript 中正确获取服务器时间、日期、偏移量和时区,独立于用户位置。例如警报消息应该是Thu Feb 12 2015 13:26:10 GMT+0200(EET)

也欢迎任何澄清为什么这不能按预期工作!

【问题讨论】:

    标签: javascript php jquery date datetime


    【解决方案1】:

    改变

    get_date.php

    <?php
    date_default_timezone_set('Romania/Bucharest');
    echo date('D M d Y H:i:s');
    exit();
    ?>
    

    还有你的脚本文件。不要将数据传递给 jquery 的 Date 函数。

    <script type='text/javascript'>
    
      $.get( "get_date.php", function(data) {
        alert(data);
      });
    
    </script>
    

    请分享结果。

    【讨论】:

    • 这只会显示没有偏移和时区信息的日期和时间。我还需要在 javascript 中创建一个 Date 对象以进行进一步操作,只显示一个字符串并没有帮助。
    • a) 您可以使用 date("e") 在服务器端生成的字符串上添加时区,但是 b) 在 JS 中进一步操作日期,这将无效。另请参阅stackoverflow.com/questions/20834411/…
    【解决方案2】:

    当您使用 JavaScript 的日期函数时,您的浏览器将根据系统的时区设置显示日期和时间。为防止您需要在服务器上格式化日期并将其作为字符串处理。 如果出于任何原因必须使用 javaScript 日期函数,则需要通过预先计算偏移量来更正日期。

    【讨论】:

      【解决方案3】:

      使用 JavaScript 的原生 Date 对象是不可能的——它始终在客户端时区运行。

      使用像 Moment.js 这样的库,它的扩展名是 Moment Timezone。这些允许您在 JS 中使用您喜欢的任何时区,包括解析日期和格式化它们的可能性。

      【讨论】:

        【解决方案4】:

        您可以使用http://json-time.appspot.com/time.json 或其变体,例如http://json-time.appspot.com/time.json?tz=GMT

        var currTime;
        $.ajax({
                    type: "GET", 
                    dataType: 'jsonp', 
                    url: "http://json-time.appspot.com/time.json",
                    async: false,
                    contentType: "application/json; charset=utf-8",
                    success: function (msg) {
                        console.log(msg);  
            // currTime.tz = "UTC"
            // currTime.hour = 12
            // currTime.datetime = "Thu, 12 Feb 2015 12:13:39 +0000"
            // currTime.minute = 13
            // currTime.second = 39              
                    }
        });
        

        这是一个 PHP 脚本,您可以将其放置在自己的服务器上并使用它来代替 json-time.appspot.com

        <?php
        header('Content-Type: application/json');
        header("Expires: Tue, 01 Jan 1990 00:00:00 GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");
        
        $error = "false";
        $tz = $_GET['tz'];
        
        if ( !in_array($tz, DateTimeZone::listIdentifiers())) {
           $error = 'invalid time zone';
           $tz = 'UTC';
        }
        
        date_default_timezone_set($tz);
        
        ?>
        <?php echo htmlspecialchars($_GET['callback'], ENT_QUOTES, 'UTF-8' ); ?>({
         "tz": "<?php echo $tz ?>",
         "hour": <?php echo date('G'); ?>,
         "datetime": "<?php echo date(DATE_RFC2822); ?>",
         "second": <?php echo intval(date('s')); ?>,
         "error": "<?php echo $error; ?>",
         "minute": <?php echo intval(date('i')); ?>
        })
        

        【讨论】:

        • 感谢您的建议,但我将如何在客户端调整脚本以获得所需的结果?
        【解决方案5】:

        在 PHP 中使用以下代码。我在我的项目中使用相同的代码来获得正确的服务器时间

         <?php 
          date_default_timezone_set('Romania/Bucharest');  
          echo date('F d,Y h:i:s');
          die();
        
        ?>
        
         <body>
        
         <!-- jQuery -->
         <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
        
         <script type='text/javascript'>
        
         $.get( "get_date.php", function(data) {
            current = new Date(data);
           alert(current);
         });
        
         </script>
        

        请参阅w3school javascript 数据函数以使用字符串获取正确的日期

        【讨论】:

          猜你喜欢
          • 2012-10-16
          • 1970-01-01
          • 2023-04-09
          • 2023-03-08
          • 2012-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-16
          相关资源
          最近更新 更多