【问题标题】:get UTC time in PHP在 PHP 中获取 UTC 时间
【发布时间】:2012-01-29 03:25:34
【问题描述】:

如何使用 PHP 的 date() 函数获取 UTC/GMT +/- 时间戳?例如,如果我尝试

date("Y-m-d H:i:s", time()); 

我会得到 Unix 时间戳;但我需要根据本地时间获取带有字符串 GMT/UTC+/-0400 或 GMT/UTC+/-1000 的 UTC/GMT 时间戳。

【问题讨论】:

    标签: php datetime utc


    【解决方案1】:

    使用 gmdate 将始终返回 GMT 日期。语法与date 相同。

    【讨论】:

    • @sanmai:根据定义,Unix 时间戳始终是 UTC。 en.wikipedia.org/wiki/Unix_time
    • @nikc.org:问题是 gmdate("U") 返回与 time() 相同,如果您的服务器系统时区不同,则不是 UTC 时间戳。我能够获得基于 UTC 的真实时间戳的唯一方法是 strtotime(gmdate("M d YH:i:s")),当您的服务器系统时区不同于 UTC /跨度>
    • @bksi 我无法重复您描述的行为。 (我的机器不在格林威治标准时间,我的 UNIX 时间戳是正确的。还有gmdate("U") == time()。)听起来像是潜在的错误行为。仔细检查并提交 PHP 项目的错误。
    • 我用简单的php脚本来测试场景: echo time()." === ".strtotime(gmdate("M d Y H:i:s"))." 时区:".date("Z")."\n"; ?> 当我运行它时,我得到这个结果:1456342082 === 1456338482 时区:3600 shell 命令日期的结果是:Wed Feb 24 20:28:11 CET 2016
    • @bksi - 也许您将日期时间的内部表示与日期时间的外部表示混淆了?没有区域说明符的时间与有区域说明符的时间?正如 nikc(和文档)所说,time() 返回“自 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)以来的秒数”。注意GMT。默认情况下,您的系统会将其转换 到您的时区以进行显示,这为用户提供了便利。在内部,它始终是 GMT。
    【解决方案2】:

    一个简单的gmdate()就足够了

    <?php
    print gmdate("Y-m-d\TH:i:s\Z");
    

    【讨论】:

      【解决方案3】:

      作为previously answered here,从PHP 5.2.0 开始,您可以使用DateTime 类并使用DateTimeZone 的实例指定UTC 时区。

      DateTime __construct() documentation 建议在创建 DateTime 实例并指定时区以获取当前时间时将“now”作为第一个参数传递。

      $date_utc = new \DateTime("now", new \DateTimeZone("UTC"));
      
      echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC
      

      【讨论】:

      • DateTime __construct() 文档不再建议省略第一个参数来获取当前时间。它现在说你应该使用一个字符串'now'。
      • 谢谢@PaulSkinner,我已经修改了答案。
      • 谢谢,DateTime 之前的反斜杠是什么用途?自己运行它,没有它们似乎也能正常工作。
      • @Snow 如果将这段代码插入命名空间代码中,假设您的文件顶部有一个namespace A 声明,PHP 将假定DateTime 引用A\DateTime,这是错误的。添加反斜杠可以解决问题。在我看来,即使你还没有使用命名空间,也要养成一个好习惯。
      【解决方案4】:
      $time = time();
      $check = $time+date("Z",$time);
      echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);
      

      【讨论】:

        【解决方案5】:

        获取 UTC 日期

        gmdate("Y-m-d H:i:s");
        

        获取 UTC 时间戳

        time();
        

        即使您的代码中有date_default_timezone_set,结果也不会有所不同。

        【讨论】:

        • @زياد 感谢您的更正,我已经修改了我的答案
        • 我认为 gmdate() 返回 GMT 而不是 UTC。 “与 date() 函数相同,只是返回的时间是格林威治标准时间 (GMT)”。我错过了什么吗?这些结果是否相同?
        • @Jordan 实际上,UTC 和 GMT 代表相同的时间。 stackoverflow.com/questions/48942916/…
        • 当然time() 返回一个整数,而gmdate 返回一个格式化字符串。因此,如果您小心使用它们,它们只是“没有什么不同”。从技术上讲,gmdate 语法与gmdate("Y-m-d H:i:s", time()); 相同,也就是说,默认情况下,格式化的时间是time()
        【解决方案6】:
        date("Y-m-d H:i:s", time() - date("Z"))
        

        【讨论】:

          【解决方案7】:

          除了调用gmdate,您还可以将此代码放在其余代码之前:

          <?php
          date_default_timezone_set("UTC");
          ?>
          

          这将使您其余与日期/时间相关的调用使用 GMT/UTC 时区。

          【讨论】:

          • 在最新版本的 PHP 中不再存在。
          • @KhomNazid "UTC" 作为参数仍然有效。 php.net/manual/en/…
          【解决方案8】:

          您可以使用不带参数的 gmmktime 函数来获取当前的 UTC 时间戳:

          $time = gmmktime();
          echo date("Y-m-d H:i:s", $time); 
          

          gmmktime 仅在您的服务器时间使用 UTC 时才有效。例如,我的服务器设置为 US/Pacific。上面列出的函数与太平洋时间相呼应。

          【讨论】:

          • gmmktime() 已弃用
          【解决方案9】:

          使用字符串 GMT/UTC +/-0400 或 GMT/UTC +/-1000,基于本地时间

          您的自定义 format 只是缺少 O 以提供与本地时间的时区偏移量。

          与格林威治时间 (GMT) 的时差示例:+0200

          date_default_timezone_set('America/La_Paz');
          echo date('Y-m-d H:i:s O');
          

          2018-01-12 12:10:11 -0400

          但是,为了最大限度地提高可移植性/互操作性,我建议使用 ISO8601 日期格式 c

          date_default_timezone_set('America/La_Paz');
          echo date('c');
          

          2018-01-12T12:10:11-04:00

          date_default_timezone_set('Australia/Brisbane');
          echo date('c');
          

          2018-01-13T02:10:11+10:00

          您也可以使用gmdate,时区偏移字符串将始终为+00:00

          date_default_timezone_set('America/La_Paz');
          echo gmdate('c');
          

          2018-01-12T16:10:11+00:00

          date_default_timezone_set('Australia/Brisbane');
          echo gmdate('c');
          

          2018-01-12T16:10:11+00:00

          【讨论】:

            【解决方案10】:

            您可以使用以下方法获取 UTC 时间:

            date_default_timezone_set('Asia/Calcutta');
            
            $current_date = date("Y/m/d g:i A");
            
            $ist_date = DateTime::createFromFormat(
                                    '"Y/m/d g:i A"',
                                    $current_date,
                                    new DateTimeZone('Asia/Calcutta')
                                );
            
            $utc_date = clone $ist_date;
            $utc_date->setTimeZone(new DateTimeZone('UTC'));
            
            echo 'UTC:  ' . $utc_date->format('Y-m-d g:i A');
            

            【讨论】:

              【解决方案11】:
              /**
                   * Converts a local Unix timestamp to GMT
                   *
                   * @param   int Unix timestamp
                   * @return  int
                   */
                  function local_to_gmt($time = '')
                  {
                      if ($time === '')
                      {
                          $time = time();
                      }
              
                      return mktime(
                          gmdate('G', $time),
                          gmdate('i', $time),
                          gmdate('s', $time),
                          gmdate('n', $time),
                          gmdate('j', $time),
                          gmdate('Y', $time)
                      );
                  }
              

              【讨论】:

                【解决方案12】:

                您想使用 gmdate 方法获取 GMT 日期。

                gmdate("Y-m-d H:i:s");
                

                gmdate 日期格式类似于 date() 方法中的格式。

                【讨论】:

                  【解决方案13】:

                  $code->created_at->setTimezone('UTC')

                  这里 $code->created_at = 亚洲/达卡时间。

                  【讨论】:

                    【解决方案14】:

                    在下面找到获取当前 UTC(协调世界时)时间的 PHP 代码

                    <?php
                    // Prints the day
                    echo gmdate("l") . "<br>";
                    
                    // Prints the day, date, month, year, time, AM or PM
                    echo gmdate("l jS \of F Y h:i:s A");
                    ?>

                    【讨论】:

                    • OP 声明:“我需要使用字符串 GMT/UTC+/-0400 获取 UTC/GMT 时间戳”,如果我运行给定的代码,则输出不包含此内容。此外,OP 表示他想为此使用date,您的代码也不包含。
                    猜你喜欢
                    • 2013-09-19
                    • 1970-01-01
                    • 2012-02-28
                    • 2019-08-25
                    • 2016-04-01
                    • 1970-01-01
                    • 2013-04-03
                    • 2017-10-07
                    相关资源
                    最近更新 更多