2012-10-25 26 views
1

我已經知道mktime返回從時代開始的秒數(1970年1月1日00:00:00 GMT),因此時間戳是基於GMT的。是否PHPs mktime()函數時區相關?

我有一個PHP網絡應用程序的學校博覽會,它是用Kohana 3.2寫的。當計劃舉辦博覽會時,我使用存儲在展會「日期」字段中的mktime創建一個時間戳。如果您想要觀看博覽會,那麼在展會開始之前,它會自動將您帶到展會的宣傳頁面。如果您嘗試查看促銷頁面並且展會已經開始,您將被髮送到查看頁面。所以你可以看到我正在做兩次檢查。

該促銷頁面使用PHP將展會時間戳存儲在隱藏字段中。使用該時間戳調用一個javascript倒計時例程,並開始倒計時在公平日期和當前時間之間剩餘的時間(轉換爲EST)。計時器達到0意味着展會已經開始,頁面被重定向到視圖頁面。

視圖頁面有一些代碼設置,可以檢查是否公平已經開始,它看起來像這樣:

if(mktime() < $fair->date) Request::current()->redirect('/fair/promo/' . $id); 

然而,當上述語句被重定向回到促銷頁面,計時器立即轉到歸零並嘗試將我發送回查看頁面。大無限循環。

以下是我在促銷頁面上如何使用JavaScript獲取時間。

var st = srvTime(); 
var d = new Date(st); 
var now = Math.round(d.getTime()/1000); 
now=now+3600; //adjust to EST 

所以問題回落到mktime()。根據php.net的說法,「從右向左的順序可以省略參數,因此省略的參數將根據當地日期和時間設置爲當前值。」那麼這是否意味着如果我在CST的服務器上調用mktime(),自epoch = CST時間以來經過的秒數 - Epoch?

+0

無限循環的代碼在哪裏? – FoolishSeth

+2

如果您輸出的是紀元時間,您可以在瀏覽器的本地時間顯示'new Date(epochValue)',並且可以從那裏使用JavaScript。堅持使用紀元時間進行數據傳輸是一種避免時區問題帶來的巨大麻煩的方法。 –

+0

當促銷頁面上的javascript計時器數到零(意味着展會已開始)並重定向到視圖頁面時,發生無限循環。然後我上面粘貼的php代碼不認爲展會已經開始,所以它將用戶發回到促銷頁面。回到本段的開頭。 – pogeybait

回答

1

參數可能從右到左依次排列;根據當地日期和時間,這樣省略的任何參數將被設置爲當前值。

+0

好吧,我的壞。你是從php mktime()頁面引用的。 – pogeybait

+0

因此,沒有參數的mktime()將返回自使用本地日期和時間的紀元以來的秒數。那麼,如果服務器在CST時區,那麼時間戳將用於CST? – pogeybait

+0

我找到了答案。我進入Kohana的bootstrap.php並將默認時區設置爲EDT,這正是我所需要的。即使你不知道Kohana,我使用的PHP命令也是date_default_timezone_set()。固定!好極了! – pogeybait