2011-04-27 41 views
5

我正在開發在線購物系統。只有英國客戶可以從網站下訂單。php date_default_timezone_set time()VS mysql now()

我想知道哪種方法適合我?

date_default_timezone_set(「Europe/London」); $ time = time();

使用mysql函數now()?

有時顧客可以選擇送貨或收款的時間。

注意:在英國,我們每年更換一次兩次!

+0

究竟是什麼操作? – deceze 2011-04-27 13:20:09

+0

需要考慮的一件事是用於存儲時間的列的類型。 'TIMESTAMP'包含帶時區的日期和時間,而'DATETIME'和'DATE'對時區沒有任何意義。爲了減少'TIMESTAMP'的吸引力,它可以存儲的範圍要小得多('1970-01-01 00:00:01'UTC到'2038-01-19 03:14:07'UTC'TIMESTAMP' vs 'DATE'和'DATETIME'爲'1000-01-01'至'9999-12-31')。 – binaryLV 2011-04-27 14:46:21

回答

5

如果時間正在發送到數據庫,使用NOW();更少的開銷,並且服務器時區有希望總是正確的,並且比PHP的時區更不易變。如果我們只是在討論顯示,而沒有真正做數據庫工作,那麼僅僅爲了獲得時間而運行mysql查詢是過分的。

2

在PHP中我通常做到以下幾點:

date_default_timezone_set('GMT'); 

,然後在連接到MySQL服務器,我執行以下查詢:

'SET time_zone = "' . date_default_timezone_get() . '";' 

這可以確保PHP和MySQL的正在使用相同的時區,所以NOW()date('Y-m-d H:i:s')都應產生相同的結果。

關於日光的變化,它們不應該是一個問題(如果您保持軟件更新)。

+1

UNIX_TIMESTAMP _always_產生相同的時間戳,因爲使用unix時間戳時區被忽略。它總是基於1971年1月1日格林威治標準時間。 – Evert 2011-04-27 13:40:52

+0

@Evert:真的,'time()'會發生同樣的事情。應該用'NOW()'和'date()'調用替代,但你明白了。 =) – 2011-04-27 14:02:53

+0

@Alix不,'time()'考慮了時區。然而,如果你使用'DateTime'類設置時間戳,那麼這將不考慮時區(它假定爲所有時間戳的GMT):'new DateTime('@ 583848395493');' – Michael 2011-04-27 14:06:44

1

這個問題的一個重要考慮是PHP和MySQL之間的時間是否相同?

如果兩個人在同一臺機器上運行,那麼答案很可能是'是',但如果他們在不同的機器上,那麼他們實際上可能會有所不同。

考慮這樣的日期將被寫入使用MySQL NOW()功能的數據庫的情況,並分別你有一個查詢,詢問在過去24小時內的所有條目,使用PHP日期函數建立時間查詢。如果PHP服務器上的時間與SQL服務器不同步,則可能會遺漏您的報告中的記錄(或者在連續的幾天內讓它們翻倍,具體取決於它們的同步方式) 。這可能導致交貨錯過等。

這樣做的結果是,您應該小心使用日期(特別是日期時間)。使用PHP或MySQL日期功能並不重要,但應該嘗試使用相同的平臺進行查詢,與以前更新一樣。

當然,這種方式並不總是很重要,而且您可以務實一些 - 有時回到數據庫太不方便,只是爲了找出時間!但是,當它很重要時,你應該小心。

當然,如果兩個系統在同一臺服務器上,這是一個不存在的問題,但您不應該認爲這將始終如此。