2015-11-03 51 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密碼,腳本將嘗試從用戶輸入中獲取它。