Bruce 的玩具間

my works and notes on ruby, rails, git, ubuntu linux, mac os x, etc...

用PHP算出兩日期差幾日 (倒數計日)

| Comments

用Date函數格式化日期的時候 (省略參數→目前時間)

PHP從參數(或省略參數時從系統中)得到一個整數

這個整數是從Unix系統零時(1970年1月1日凌晨) (有人說Unix時期、總之就是設定給Unix的誕辰日) ~~到指定時間點的累積總秒數 (叫epoch day,以下用timestamp表示)

例如:1970年1月2日下午3點半的timestamp等於142200 (39小時+30分鐘=140400+1800)

PHP下可以用mktime來產生指定日期時間的timestamp (請自行參考函式庫)

☆注意:

Unix系統零時是在格林威治時間(GMT)下,台灣的時區是GMT+8,也就是早GMT 8小時

時區設定在台灣的主機,使用mktime的PHP函數 產生1970.1.1 0:00:00的timestamp將小於0!!! (當時GMT還在1969.12.31 16:00:00)

換句話說,產生1970.1.1 8:00:00的timestamp將等於0 (GMT正好到1970.1.1 0:00:00)

這麼說...用mktime產生目前時間的timestamp都會差8小時了!!

這時可以用gmmktime函數(將參數給的時間視為GMT時間而非該時區的時間) 直接產生GMT的timestamp

但是gmmktime在時區為台灣的主機,仍無法產生1970.1.1 8:00:00以前的timestamp (這我就想不通為什麼了...錯誤訊息:[Warning: gmmktime(): Windows does not support negative values for this function] 不巧手邊也沒Linux主機可以測試....)

知道timestamp是總秒數了...那如果把兩日期的timestamp相減,得到的不就是兩日期的差異總秒數了嗎!?

要算差異的天數的話,那就是除以1天的秒數囉 (1天=86400秒)

筆者這支程式取得timestamp的函數用strtotime,省得時分秒的問題 (strtotime使用方法請自行參考函式庫) 但是取得的是主機的時區...不過因為不可能遇到1970.1.1前8小時的情況(除非故意的)...所以筆者就不予考慮...

照這個想法寫的程式如下: (範例是今年的統一入學測驗日,是5月20號)

$today = strtotime(date("Y-n-j"));

$tdehu = strtotime("2006-5-20");

$diff = ($tdehu - $today) / 86400;

echo "倒數$diff天"

Comments

comments powered by Disqus