2015-11-03 49 views
4

我在系统和PHP之间得到不同的日期/时间。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选择系统日期/时间?

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

谢谢。

+3

使用['date_default_timezone_set()'](http://php.net/manual/en/function.date-default-timezone-set.php)设置默认时区 –

+0

我仍然获得PHP日期/时间在UTC甚至在valling'date_default_timezone_set()' –

+0

可能重复[如何获取本地系统时间在PHP?](http://stackoverflow.com/questions/2329467/how-do-i-get-the-本地系统时间在PHP) – HPierce

回答

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上工作。

0

在您的文件顶部尝试输入。

date_default_timezone_set('Country'); 

例子:
date_default_timezone_set('Hongkong');

+0

这意味着硬编码tmezone,我试图避免。 –

0

理想情况下,你应该配置每个服务器的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脚本中存储根密码的做法,但我已包含完整性选项 - 谨慎使用,这是一个安全漏洞。在OSX上,如果没有提供root密码,脚本将尝试从用户输入中获取它。