date_default_timezone_set的問題

 在php中,我們可以通過date函數來獲取系統當前時間,date函數的參數已經夠豐富了,其中包括自定義時期顯示格式和獲取相應時區的功能。但是強大的功能沒法自定時區來輸出。舉個例子,在locale = ZH_CN的操作系統上,date函數可能輸出UTC+8的時間。也就是標準的北京時間,這與操作系統shell中使用date命令查看的結果一樣。但是在有的業務系統中,我們可能會提供接口給管理員配置業務系統的時間顯示區域,即配置時區。例如,在locale=zh-cn的操作系統中設置時區爲Asia/Seoul(朝鮮,UTC+9)。則使用date命令和PHP中使用date函數輸出的時間相差1小時(東8區和東9區相差一小時)。在php5.1之後的版本中,爲了靈活地根據指定的時區來獲取時間,解釋器提供了獲取和設定時區的接口date_default_timezone_set。這樣,假如我們需要使date命令和phpdate函數去到的時間一樣,我們可以這樣

date_default_timezone_set('Asia/Seoul’);
 date( 'Y-m-d H:i' )。這是我們一般設定默認時區的做法,但這樣兩個問題:
一 date_default_timezone_set作用域問題
    date_default_timezone_set的作用域只限於當前模塊,假如我們的程序第一次請求A.getDate.在這個方法中,我們調用date_default_timezone_set來重設了默認時區,當我們第二次請求 B.getDate時,第一次請求的date_default_timezone_set的設置不會影響到第二次請求。如果B.getDate中沒有調用date_default_timezone_set。那麼date函數將會得到一個和date命令不一樣的結果。也就是說date_default_timezone_set函數不會對操作系統甚至php解釋器環境造成永久的影響。當一次請求被解釋返回後,date_default_timezone_set的結果會被解釋器釋放。這是其一。
二  date_default_timezone_set會對exec函數造成影響。
    php可以通過exec來調用外部程序,例如執行ls -l /etc/localtime (CMD)。如果在調用exec之前php解釋器調用了date_default_timezone_set(針對同一次請求)。那麼CMD的返回結果會和在shell中執行ls -l /etc/localtime的結果有所不同。其中不一同的地方是文件日期的現實格式和日期的內容。也就是說在date_default_timezone_set之後的exec函數輸入的時間格式會受到date_default_timezone_set設定的時區的影響。因此,當exec調用的命令會返回一個日期,而這個返回結果對程序很重要時,需要慎重。
 
由於一樣兩個原因,在提供系統可配置時區的接口的同時,我不得不修改需要exec返回結果帶有日期的地方。
 
另:
   php exec函數在執行shell命令時貌似awk '{print $NF}'不起作用。該命令不是返回最後一個字段。而是將整行輸出。
在shell中執行相同的命令沒有此問題。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章