【问题标题】:PHP & system dates are differentPHP 和系统日期不同
【发布时间】:2015-11-03 16:37:46
【问题描述】:

我在系统和 PHP 之间得到不同的日期/时间。

系统

        $ date
        Tue Nov  3 19:16:51 EAT 2015

PHP

        echo date("D M j G:i:s T Y");
        -> Tue Nov 3 16:16:23 UTC 2015

即使系统有不同的时区,PHP 似乎默认为 UTC。如何让 PHP 选择系统日期/时间?

注意:出于维护原因,我避免对时区进行硬编码。

谢谢。

【问题讨论】:

标签: php datetime timezone


【解决方案1】:

在 PHP 中获取系统日期/时间似乎没有简单(独立于系统)的方法,但这似乎可行:

    $timezone = 'UTC';
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
         $timezone = exec('tzutil /g');
    } else {
            $timezone = exec('date +%Z');
    }

    $localTimezone = new DateTimeZone($timezone);
    $myDateTime = new DateTime(date(), $localTimezone);
    echo ($myDateTime->format('D M j G:i:s T Y') );

我没有在 Windows 上测试过,但在 Linux 上它可以工作。

【讨论】:

    【解决方案2】:

    在文件顶部尝试此输入。

    date_default_timezone_set('Country');
    

    示例:
    date_default_timezone_set('Hongkong');

    【讨论】:

    • 这意味着硬编码 tmezone,我试图避免这种情况。
    【解决方案3】:

    理想情况下,您应该配置每个服务器的php.ini,其中可以设置date.timezone

    ; ...
    
    [Date]
    ; Defines the default timezone used by the date functions
    ; http://php.net/date.timezone
    date.timezone = 'America/Chicago'
    
    ; ...
    

    可以在PHP manual 中找到可接受的时区列表。


    如果您想在每个脚本上设置它,这里有一个独立于平台的函数来设置它:

    <?php
    function setTimezone($OSXPassword = null){
    
        $timezone = null;
        switch(true){
            //Linux (Tested on Ubuntu 14.04)
            case(file_exists('/etc/timezone')):
                $timezone = file_get_contents('/etc/timezone');
                $timezone = trim($timezone); //Remove an extra newline char.
                break;
    
            //Windows (Untested) (Thanks @Mugoma J. Okomba!)
            case(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'):
                $timezone = exec('tzutil /g');
                break;
    
            //OSX (Tested on OSX 10.11 - El Capitan)
            case(file_exists('/usr/sbin/systemsetup')):
                if(!isset($OSXPassword)){
                    $OSXPassword = readline('**WARNING your input will appear on screen!**  Password for sudo: ');
                }
                $timezone = exec("echo '" . $OSXPassword ."' | sudo -S systemsetup -gettimezone");
                $timezone = substr($timezone, 11);
                break;
        }
    
        if(empty($timezone)){
            trigger_error('setTimezone could not determine your timezone', E_USER_ERROR);
        } else {
            date_default_timezone_set($timezone);
        }
    
        return $timezone;
    }
    
    setTimezone();
    ?>
    

    如您所知,对 OSX 的支持是粗略的。

    在 OSX 上获取时区的唯一不错的方法是通过systemsetup,这需要超级用户运行。我真的讨厌在 PHP 脚本中存储 root 密码的做法,但我已经包含了完整性选​​项 - 谨慎使用,这是一个安全漏洞。在 OSX 上,如果没有提供 root 的密码,脚本将尝试从用户输入中获取它。

    【讨论】:

      【解决方案4】:

      我只使用了原始系统日期。似乎是显而易见的解决方案。我是这样做的:

      //*** OVERRIDE PHP DATE WITH RAW SYSTEM DATE ****
      $sysdate = exec('date +%Y-%m-%d_%H:%M:%S');
      $sysdate = str_replace("_"," ",$sysdate);
      $sd = strtotime($sysdate);
      
      $MM = date ("m", $sd);
      $DD = date ("d", $sd);
      $YY = date ("Y", $sd);
      $HH = date ("H", $sd);
      $MN = date ("i", $sd);
      $SS = date ("s", $sd);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 2017-01-15
        • 1970-01-01
        • 1970-01-01
        • 2018-06-22
        • 2015-11-12
        • 2012-05-05
        相关资源
        最近更新 更多