php時區(qū)是一個非常有意思的問題,安裝好apache+php環(huán)境之后會發(fā)現(xiàn)我們使用date函數(shù)獲取的日期都與中國時間有8小時區(qū)別了,那?這個時區(qū)問題要如何解決呢?下面本人整理了一些關(guān)于php時區(qū)設(shè)置方法,有需要的朋友可進(jìn)入?yún)⒖?
時區(qū)劃分
整個地球分為24個時區(qū),每個時序都有自己的本地時間,同一時間,每個時區(qū)的本地時間相差1到23個小時,例如,英國倫敦本地時間與北京本地時間相差8個小時,在國際無線電通信領(lǐng)域,使用一個統(tǒng)一的時間,稱為通用協(xié)調(diào)時間(UTC,Universal Time Coordinated),UTC與格林威治標(biāo)準(zhǔn)時間(GMT,Greenwich Mean Time)相同,都與英國倫敦的本地時間相同
時區(qū)設(shè)置
由于PHP5.0對data()函數(shù)進(jìn)行?重寫,因此,目前的日期時間函數(shù)比系統(tǒng)時間少8個小時。在PHP語言中默認(rèn)設(shè)置的是標(biāo)準(zhǔn)的格林威治時間(即采用的是零時區(qū)),所以要獲取本地當(dāng)前的時間必須更改PHP語言中的時區(qū)設(shè)置。
更改PHP語言中的時區(qū)設(shè)置有兩種方法:
(1)修改php.ini文件中的設(shè)置,找到[date]下的“;date.timezone=”選項,將其修改為“date.timezone=Asia/Hong_Kong”,然后重新啟動Apache服務(wù)器。
修改PHP.ini這個文件,找到date.timezone這行,去掉前面的分號,改成:
date.timezone = Asia/Shanghai
修改 .htaccess文件,修改.htaccess文件有兩種辦法,下面的兩條語句只要有一條即可:
php_value date.timezone Asia/Shanghai
SetEnv TZ Asia/Shanghai
(2)在應(yīng)用程序中,在使用時間日期函數(shù)之前添加如下函數(shù):
date_default_timezone_set('Asia/Shanghai');
date_default_timezone_set('Asia/Chongqing');
date_default_timezone_set('PRC');
i ni_set('date.timezone','Etc/GMT-8');
ini_set('date.timezone','PRC');
ini_set('date.timezone','Asia/Shanghai');
ini_set('date.timezone','Asia/Chongqing');
date_default_timezone_set('PRC');
<?php
date_default_timezone_set("Asia/Kolkata");
echo date('d-m-Y H:i:s');
?>
參數(shù)為PHP可識別的時區(qū)名稱,如果時區(qū)名稱PHP無法識別,則系統(tǒng)采用UTC時區(qū),在PHP手冊中提供了各個時區(qū)名稱列表,其中,設(shè)置我國北京時間可以使用的時區(qū)包括:PRC(中華人民共和國)、Asia/Chongqing(重慶)、Asia/Shanghai(上海)或者Asia/Urumqi(烏魯木齊),這幾個時區(qū)名稱等效的.
設(shè)置完成后,date()函數(shù)便可以正常使用,不會再出現(xiàn)時差問題.
輸出系統(tǒng)的當(dāng)前時間:
上面是一種設(shè)置系統(tǒng)當(dāng)前時間的方法,在這里將采用另外一種方式設(shè)置系統(tǒng)當(dāng)前的時間,即直接在date()函數(shù)之前通過date_default_timezone_set()函數(shù)設(shè)置系統(tǒng)的時區(qū),并輸出系統(tǒng)當(dāng)前的日期和時間,代碼如下:
<?php
echo "UTC時間:".date("Y-m-d H:i:s");
date_default_timezone_set("PRC");
echo "<br>";
echo "北京時間:".date("Y-m-d H:i:s");
echo "<br>";
echo "中文時間:".date("Y年m月d日 H時i分s秒");
echo "<br>";
echo "當(dāng)前時區(qū):".date_default_timezone_get();
?>
測試,代碼如下:
<?php
date_default_timezone_set(‘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’);
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
結(jié)論:time():標(biāo)準(zhǔn)時間戳
指返回自從 Unix 紀(jì)元(格林威治時間 1970 年 1 月 1 日 00:00:00)到當(dāng)前時間(指的是當(dāng)前GMT標(biāo)準(zhǔn)時間)的秒數(shù),它的值跟php系統(tǒng)設(shè)置的時區(qū)無關(guān).
date():返回的是當(dāng)前 GMT標(biāo)準(zhǔn)時間的本地化時間的“自定義格式”時間,跟php系統(tǒng)設(shè)置的時區(qū)有關(guān).
gmdate():返回的是當(dāng)前 GMT標(biāo)準(zhǔn)時間的“自定義格式”時間,跟php系統(tǒng)設(shè)置的時區(qū)無關(guān).
unix時間戳:指的是當(dāng)前(GMT標(biāo)準(zhǔn))時間離unix紀(jì)元時間(1970-01-01 00:00:00)的秒數(shù).
date_default_timezone_set(‘Etc/GMT’);
echo(strtotime(’1970-01-01 08:00:00′));
echo(‘
’);
date_default_timezone_set(‘PRC’);
echo(strtotime(’1970-01-01 08:00:00′));
?>
28800
0
strtotime(a):當(dāng)前時間的GMT標(biāo)準(zhǔn)時間的unix時間戳,如果當(dāng)前php系統(tǒng)的設(shè)置的時區(qū)不是GMT標(biāo)準(zhǔn)時區(qū),則在應(yīng)用strtotime(a)時,系統(tǒng)會自動把時間a折算成相?的GMT標(biāo)準(zhǔn)時間,然后計算這個時間的unix時間戳,跟php系統(tǒng)設(shè)置的時區(qū)有關(guān).