我在系统和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选择系统日期/时间?
注意:出于维护原因,我正在避免对时区进行硬编码。
感谢。
答案 0 :(得分: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上它可以运行。
答案 1 :(得分:0)
在文件顶部尝试此输入。
date_default_timezone_set('Country');
示例:强>
date_default_timezone_set('Hongkong');
答案 2 :(得分: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脚本中存储root用户密码的做法,但我已经提供了完整性选项 - 谨慎使用,这是一个安全漏洞。在OSX上,如果未提供root用户密码,脚本将尝试从用户输入中获取密码。
答案 3 :(得分:0)
我刚刚使用了原始系统日期。似乎是明显的解决方案。以下是我的表现方式:
//*** 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);