php时区是一个非常有意思的问题,安装好apache+php环境之后会发现我们使用date函数获取的日期都与中国时间有8小时区别了,那么这个时区问题要如何解决呢?下面本人整理了一些关于php时区设置方法,有需要的朋友可进入参考。
时区划分
整个地球分为24个时区,每个时序都有自己的本地时间。同一时间,每个时区的本地时间相差1到23个小时,例如,英国伦敦本地时间与北京本地时间相差8个小时。在国际无线电通信领域,使用一个统一的时间,称为通用协调时间(utc,universal time coordinated),utc与格林威治标准时间(gmt,greenwich mean time)相同,都与英国伦敦的本地时间相同
时区设置
由于php5.0对data()函数进行了重写,因此,目前的日期时间函数比系统时间少8个小时。在php语言中默认设置的是标准的格林威治时间(即采用的是零时区),所以要获取本地当前的时间必须更改php语言中的时区设置。
更改php语言中的时区设置有两种方法:
(1)修改php.ini文件中的设置,找到[date]下的“;date.timezone=”选项,将其修改为“date.timezone=asia/hong_kong”,然后重新启动apache服务器。
修改php.ini这个文件
找到date.timezone这行,去掉前面的分号,改成:
代码如下 复制代码
date.timezone = asia/shanghai
修改 .htaccess文件
修改.htaccess文件有两种办法,下面的两条语句只要有一条即可
代码如下 复制代码
php_value date.timezone asia/shanghai
setenv tz asia/shanghai
(2)在应用程序中,在使用时间日期函数之前添加如下函数:
在代码中设置时区
代码如下 复制代码
1 date_default_timezone_set('asia/shanghai');//'asia/shanghai' 亚洲/上海
2 date_default_timezone_set('asia/chongqing');//其中asia/chongqing'为“亚洲/重庆”
3 date_default_timezone_set('prc');//其中prc为“中华人民共和国”
4i ni_set('date.timezone','etc/gmt-8');
5 ini_set('date.timezone','prc');
6 ini_set('date.timezone','asia/shanghai');
7 ini_set('date.timezone','asia/chongqing');
date_default_timezone_set('prc');
//prc为中华人民共和国时区
或者
代码如下 复制代码
参数为php可识别的时区名称,如果时区名称php无法识别,则系统采用utc时区。在php手册中提供了各个时区名称列表,其中,设置我国北京时间可以使用的时区包括:prc(中华人民共和国)、asia/chongqing(重庆)、asia/shanghai(上海)或者asia/urumqi(乌鲁木齐),这几个时区名称等效的。
设置完成后,date()函数便可以正常使用,不会再出现时差问题。
输出系统的当前时间
上面是一种设置系统当前时间的方法,在这里将采用另外一种方式设置系统当前的时间,即直接在date()函数之前通过date_default_timezone_set()函数设置系统的时区,并输出系统当前的日期和时间。代码如下
代码如下 复制代码
测试:
代码如下 复制代码
代码
date_default_timezone_set(‘etc/gmt’);
//在输出时间之前设置时区,etc/gmt为时间标准时间
echo(time());
echo(‘
’);
echo date(‘y-m-d h:i:s’, time());
echo(‘
’);
echo gmdate (“y-m-d h:i:s”, time());
echo(‘
’);
date_default_timezone_set(‘prc’);
//在输出时间之前设置时区,prc为中华人民共和国
echo(time());
echo(‘
’);
echo date(‘y-m-d h:i:s’, time());
echo(‘
’);
echo gmdate (“y-m-d h:i:s”, time());
?>
结果:
1276257131
2010-06-11 11:52:11
2010-06-11 11:52:11
1276257131
2010-06-11 19:52:11
2010-06-11 11:52:11
结论:
time() :标准时间戳
指返回自从 unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间(指的是当前gmt标准时间)的秒数,它的值跟php系统设置的时区无关。
date():返回的是当前 gmt标准时间的本地化时间的“自定义格式”时间,跟php系统设置的时区有关。
gmdate():返回的是当前 gmt标准时间的“自定义格式”时间,跟php系统设置的时区无关
unix时间戳:指的是当前(gmt标准)时间离unix纪元时间(1970-01-01 00:00:00)的秒数;
代码
date_default_timezone_set(‘etc/gmt’);
//在输出时间之前设置时区,etc/gmt为时间标准时间
echo(strtotime(’1970-01-01 08:00:00′));
echo(‘
’);
date_default_timezone_set(‘prc’);
//在输出时间之前设置时区,prc为中华人民共和国
echo(strtotime(’1970-01-01 08:00:00′));
?>
测试结果:
28800
0
strtotime(a):当前时间的gmt标准时间的unix时间戳,如果当前php系统的设置的时区不是gmt标准时区,则在应用strtotime(a)时,系统会自动把时间a折算成相应的gmt标准时间,然后计算这个时间的unix时间戳。跟php系统设置的时区有关