php时区设定,确保date()返回正确的本地时间,php程序报date()警告的处理(date_default_timezone_set)。PHP5中的时间相差8小时的解决办法。PHP错误日志的时间与系统时间不一致,怎么解决?Linux下查看/修改系统时区、时间。

jackxiang 2013-8-23 17:27 | |
背景:做了个聊天程序,发现后面的时间显示有问题。
写到文件第一行内:

问题:echo date('Y-m-d H:i:s'); 输出结果与本地时间相差8小时。一看就知道我们神州大地是在东八区,时区错了。
三种解决方法:
1.加入date_default_timezone_set('PRC');//手册上说这个是PHP5.1后才有的
2. 修改php.ini
   [Date]
; Defines the default timezone used by the date functions
date.timezone = PRC 注:PRC为中化人民共和国
相关参考如下:
#############################################################################
从 PHP 5.1.0 ,当对使用date()等函数时,如果timezone设置不正确,在每一次调用时间函数时,都会产生E_NOTICE 或者 E_WARNING 信息。而又在php5.1.0中,date.timezone这个选项,默认情况下是关闭的,无论用什么php命令都是格林威治标准时间,但是PHP5.3中好像如果没有设置也会强行抛出了这个错误的,解决此问题,只要本地化一下,就行了。
以下是三种方法(任选一种都行):
一、在页头使用date_default_timezone_set()设置 date_default_timezone_set('PRC'); //东八时区 echo date('Y-m-d H:i:s');

二、在页头使用 ini_set('date.timezone','Asia/Shanghai');

三、修改php.ini。打开php5.ini查找date.timezone 去掉前面的分号修改成为:date.timezone =PRC
重启http服务(如apache2或iis等)即可。  
XXX可以任意正确的值。对于我们国内来说:可以为以下值:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木齐)港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北),还有新加坡:Asia/Singapore,当然PRC也行。
来自:http://wz102.blog.51cto.com/3588520/1243649
#############################################################################
bool date_default_timezone_set ( string timezone_identifier )
说明
date_default_timezone_set() 设定用于所有日期时间函数的默认时区。
注: 自 PHP 5.1.0 起(此版本日期时间函数被重写了),如果时区不合法则每个对日期时间函数的调用都会产生一条 E_NOTICE 级别的错误信息。
参数
timezone_identifier
时区标识符,例如 UTC 或 Europe/Lisbon
返回值
本函数永远返回 TRUE(即使 timezone_identifier 参数不合法)。

来自:http://www.css88.com/archives/4552

在写php程序中有时会出现这样的警告:
[07-Jan-2014 07:21:44 UTC] PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in Unknown on line 0

PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for '8.0/no DST' instead in D:\PHPWEB ews\file.php on line 17 。


这是因为PHP所取的时间是格林威治标准时间,所以和你当地的时间会有出入格林威治标准时间和北京时间大概差8个小时左右,我们可以按照下面的方法解决:

1、在页头使用date_default_timezone_set()设置我的默认时区为北京时间,即 <?php date_default_timezone_set("PRC"); ?>就可以了。

2、在php.ini中设置date.timezone的值为PRC,设置好以后的为:date.timezone=PRC或者date.timezone = Asia/Shanghai,同时取消这一行代码的注释,即去掉前面的分号就可以了。

然后重启apache即可!
参考:http://www.jb51.net/article/42315.htm
PHP5中的时间相差8小时的解决办法:
http://www.jb51.net/article/13988.htm

————背景:遇到线上仿真机的PHP错误日志的时间不对————
PHP错误日志的时间与系统时间不一致,怎么解决?来自:http://zhidao.baidu.com/link?url=Dx0OfG9Kd5xkb_plZeopiskR_jUnCqB2WLdBXshvpv5hJTAi-UHUoSC4qRHK7mFCP84118D3mRhWlcBdwNX2dbl7MnocNPPDQeycWxnUkgW
我已经把php.ini的date.timezone设置为PRC了,调用date("H:i:s")函数也能输出与系统时间相一致的时间,但就是不知道为什么错误日志里的时间总是跟系统时间相差8个小时
提问者采纳

你修正只是php这样级别的时区,所以网页显示出来的时间跟你浏览器所在电脑时间是一致的(修正好了)。
但错误日志的运行一般是apache或者php-cgi,它们是直接调用操作系统的时间和时区的,所以写出来的日志时间有时差。依照你的描述,估计你用的是linux,试一下修正一下linux的时区一下就可以了。命令如下:
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

实践如下:
[root@localhost etc]# cp localtime localtime.bak.2013.12.25
[root@localhost etc]# ls /usr/share/zoneinfo/Asia/Shanghai
/usr/share/zoneinfo/Asia/Shanghai
[root@localhost etc]# rm -Rf localtime
[root@localhost etc]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
然后最好使用下面的命令将更改写入bios。
hwclock
[root@localhost tmp]# hwclock
Wed 25 Dec 2013 11:07:18 AM CST  -0.848372 seconds  【后面发现还是不行,估计机器有问题。】
必须要生效才行,上面生效来自:
http://soft.chinabyte.com/133/11146633.shtml



摘录自:http://ggmmchou.blog.163.com/blog/static/5933314920091137114514/
方法(1)  
# tzselect  
方法(2 仅限于RedHat Linux 和 CentOS)  
# timeconfig  
方法(1)
  # tzselect
  方法(2 仅限于RedHat Linux 和 CentOS)
  # timeconfig3. 复制相应的时区文件,替换系统默认时区
  CentOS实践:
[root@localhost tmp]# tzselect  
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
1) Afghanistan           18) Israel                35) Palestine
2) Armenia               19) Japan                 36) Philippines
3) Azerbaijan            20) Jordan                37) Qatar
4) Bahrain               21) Kazakhstan            38) Russia
5) Bangladesh            22) Korea (North)         39) Saudi Arabia
6) Bhutan                23) Korea (South)         40) Singapore
7) Brunei                24) Kuwait                41) Sri Lanka
8) Cambodia              25) Kyrgyzstan            42) Syria
9) China                 26) Laos                  43) Taiwan
10) Cyprus                27) Lebanon               44) Tajikistan
11) East Timor            28) Macau                 45) Thailand
12) Georgia               29) Malaysia              46) Turkmenistan
13) Hong Kong             30) Mongolia              47) United Arab Emirates
14) India                 31) Myanmar (Burma)       48) Uzbekistan
15) Indonesia             32) Nepal                 49) Vietnam
16) Iran                  33) Oman                  50) Yemen
17) Iraq                  34) Pakistan
#? 9
Please select one of the following time zone regions.
1) east China - Beijing, Guangdong, Shanghai, etc.
2) Heilongjiang (except Mohe), Jilin
3) central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
4) most of Tibet & Xinjiang
5) west Tibet & Xinjiang
#? 1
The following information has been given:
        China
        east China - Beijing, Guangdong, Shanghai, etc.
Therefore TZ='Asia/Shanghai' will be used.
Local time is now:      Wed Dec 25 11:49:52 CST 2013.
Universal Time is now:  Wed Dec 25 03:49:52 UTC 2013.
Is the above information OK?
1) Yes
2) No
#? 1    
You can make this change permanent for yourself by appending the line
        TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai

# cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime  
对于中国服务器则执行:  
# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  
# cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
  对于中国服务器则执行:
  # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 4. 将当前时间写入BIOS永久生效(避免重启后失效)  
# hwclock  
# hwclock

[root@localhost tmp]# date -R
Wed, 25 Dec 2013 11:56:13 +0800
来自:http://www.cnblogs.com/ningvsban/archive/2012/12/18/2823036.html




1)查看Linux硬件时间
[root@localhost tmp]# hwclock --show
Wed 25 Dec 2013 01:02:15 PM CST  -0.494817 seconds
[root@localhost tmp]# date
Wed Dec 25 13:40:48 CST 2013
2)修改Linux硬件时间
hwclock --set --date
3)让系统时间与硬件时钟同步,用:
hwclock --hctosys
4)相反地,让硬件时钟与系统时间同步:
hwclock --systohc
对上面1)进行同步操作(让硬件时钟与系统时间同步)的实践OK:
[root@localhost tmp]# hwclock --systohc
[root@localhost tmp]# hwclock --show
Wed 25 Dec 2013 01:44:36 PM CST  -0.973671 seconds
[root@localhost tmp]# date
Wed Dec 25 13:44:40 CST 2013
没同步上,直接修改硬件时间:
[root@localhost tmp]# hwclock --set --date "2013-12-25 13:48:51"  
[root@localhost tmp]# hwclock --show
Wed 25 Dec 2013 01:48:56 PM CST  -0.365535 seconds
[root@localhost tmp]# date
Wed Dec 25 13:48:39 CST 2013
来自:http://blog.163.com/dk_linux/blog/static/20322616620122401426999/

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6611/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2014-9-25 11:22
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]